LCOV - code coverage report
Current view: top level - /mnt/build/buildbot/bld/build-lcov/gcc/m2/gm2-compiler-boot - M2SymInit.c (source / functions) Coverage Total Hit
Test: gcc.info Lines: 83.8 % 951 797
Test Date: 2025-01-11 13:11:20 Functions: 75.8 % 91 69
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /* do not edit automatically generated by mc from M2SymInit.  */
       2                 :             : /* M2SymInit.mod records initialization state for variables.
       3                 :             : 
       4                 :             : Copyright (C) 2001-2025 Free Software Foundation, Inc.
       5                 :             : Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
       6                 :             : 
       7                 :             : This file is part of GNU Modula-2.
       8                 :             : 
       9                 :             : GNU Modula-2 is free software; you can redistribute it and/or modify
      10                 :             : it under the terms of the GNU General Public License as published by
      11                 :             : the Free Software Foundation; either version 3, or (at your option)
      12                 :             : any later version.
      13                 :             : 
      14                 :             : GNU Modula-2 is distributed in the hope that it will be useful, but
      15                 :             : WITHOUT ANY WARRANTY; without even the implied warranty of
      16                 :             : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      17                 :             : General Public License for more details.
      18                 :             : 
      19                 :             : You should have received a copy of the GNU General Public License
      20                 :             : along with GNU Modula-2; see the file COPYING3.  If not see
      21                 :             : <http://www.gnu.org/licenses/>.  */
      22                 :             : 
      23                 :             : #define INCLUDE_MEMORY
      24                 :             : #include "config.h"
      25                 :             : #include "system.h"
      26                 :             : #include "gcc-consolidation.h"
      27                 :             : 
      28                 :             : #include <stdbool.h>
      29                 :             : #   if !defined (PROC_D)
      30                 :             : #      define PROC_D
      31                 :             :        typedef void (*PROC_t) (void);
      32                 :             :        typedef struct { PROC_t proc; } PROC;
      33                 :             : #   endif
      34                 :             : 
      35                 :             : #   if !defined (TRUE)
      36                 :             : #      define TRUE (1==1)
      37                 :             : #   endif
      38                 :             : 
      39                 :             : #   if !defined (FALSE)
      40                 :             : #      define FALSE (1==0)
      41                 :             : #   endif
      42                 :             : 
      43                 :             : #   include "GStorage.h"
      44                 :             : #   include "Gmcrts.h"
      45                 :             : #if defined(__cplusplus)
      46                 :             : #   undef NULL
      47                 :             : #   define NULL 0
      48                 :             : #endif
      49                 :             : #define _M2SymInit_C
      50                 :             : 
      51                 :             : #include "GM2SymInit.h"
      52                 :             : #   include "GStorage.h"
      53                 :             : #   include "GM2Debug.h"
      54                 :             : #   include "GM2Printf.h"
      55                 :             : #   include "Glibc.h"
      56                 :             : #   include "GNameKey.h"
      57                 :             : #   include "GM2Base.h"
      58                 :             : #   include "GM2Options.h"
      59                 :             : #   include "GM2MetaError.h"
      60                 :             : #   include "GM2LexBuf.h"
      61                 :             : #   include "GDynamicStrings.h"
      62                 :             : #   include "GM2Error.h"
      63                 :             : #   include "GM2BasicBlock.h"
      64                 :             : #   include "GIndexing.h"
      65                 :             : #   include "GLists.h"
      66                 :             : #   include "GSymbolTable.h"
      67                 :             : #   include "GM2Quads.h"
      68                 :             : #   include "GM2GCCDeclare.h"
      69                 :             : 
      70                 :             : #   define Debugging false
      71                 :             : typedef struct M2SymInit_recordDesc_r M2SymInit_recordDesc;
      72                 :             : 
      73                 :             : typedef struct M2SymInit__T1_r M2SymInit__T1;
      74                 :             : 
      75                 :             : typedef struct M2SymInit__T2_r M2SymInit__T2;
      76                 :             : 
      77                 :             : typedef M2SymInit__T2 *M2SymInit_symAlias;
      78                 :             : 
      79                 :             : typedef struct M2SymInit__T3_r M2SymInit__T3;
      80                 :             : 
      81                 :             : typedef M2SymInit__T3 *M2SymInit_bbEntry;
      82                 :             : 
      83                 :             : typedef enum {M2SymInit_scalar, M2SymInit_record} M2SymInit_descType;
      84                 :             : 
      85                 :             : typedef M2SymInit__T1 *M2SymInit_InitDesc__opaque;
      86                 :             : 
      87                 :             : struct M2SymInit_recordDesc_r {
      88                 :             :                                 Indexing_Index fieldDesc;
      89                 :             :                               };
      90                 :             : 
      91                 :             : struct M2SymInit__T2_r {
      92                 :             :                          unsigned int keySym;
      93                 :             :                          unsigned int alias;
      94                 :             :                          M2SymInit_symAlias next;
      95                 :             :                        };
      96                 :             : 
      97                 :             : struct M2SymInit__T3_r {
      98                 :             :                          unsigned int start;
      99                 :             :                          unsigned int end;
     100                 :             :                          bool first;
     101                 :             :                          bool endCall;
     102                 :             :                          bool endGoto;
     103                 :             :                          bool endCond;
     104                 :             :                          bool topOfLoop;
     105                 :             :                          unsigned int trashQuad;
     106                 :             :                          unsigned int indexBB;
     107                 :             :                          unsigned int nextQuad;
     108                 :             :                          unsigned int condQuad;
     109                 :             :                          unsigned int nextBB;
     110                 :             :                          unsigned int condBB;
     111                 :             :                          M2SymInit_bbEntry next;
     112                 :             :                        };
     113                 :             : 
     114                 :             : struct M2SymInit__T1_r {
     115                 :             :                          unsigned int sym;
     116                 :             :                          unsigned int type;
     117                 :             :                          bool initialized;
     118                 :             :                          M2SymInit_descType kind;  /* case tag */
     119                 :             :                          union {
     120                 :             :                                  M2SymInit_recordDesc rec;
     121                 :             :                                };
     122                 :             :                        };
     123                 :             : 
     124                 :             : static Indexing_Index IndirectArray;
     125                 :             : static Indexing_Index LArray;
     126                 :             : static M2SymInit_symAlias freeList;
     127                 :             : static Indexing_Index bbArray;
     128                 :             : static M2SymInit_bbEntry bbFreeList;
     129                 :             : static Lists_List ignoreList;
     130                 :             : static Lists_List errorList;
     131                 :             : 
     132                 :             : /*
     133                 :             :    PrintSymInit -
     134                 :             : */
     135                 :             : 
     136                 :             : extern "C" M2SymInit_InitDesc M2SymInit_InitSymInit (void);
     137                 :             : 
     138                 :             : /*
     139                 :             :    PrintSymInit -
     140                 :             : */
     141                 :             : 
     142                 :             : extern "C" void M2SymInit_KillSymInit (M2SymInit_InitDesc *desc);
     143                 :             : 
     144                 :             : /*
     145                 :             :    PrintSymInit -
     146                 :             : */
     147                 :             : 
     148                 :             : extern "C" void M2SymInit_ConfigSymInit (M2SymInit_InitDesc desc, unsigned int sym);
     149                 :             : 
     150                 :             : /*
     151                 :             :    PopulateFields -
     152                 :             : */
     153                 :             : 
     154                 :             : extern "C" void M2SymInit_SetInitialized (M2SymInit_InitDesc desc);
     155                 :             : 
     156                 :             : /*
     157                 :             :    PopulateFields -
     158                 :             : */
     159                 :             : 
     160                 :             : extern "C" bool M2SymInit_GetInitialized (M2SymInit_InitDesc desc);
     161                 :             : 
     162                 :             : /*
     163                 :             :    PopulateFields -
     164                 :             : */
     165                 :             : 
     166                 :             : extern "C" M2SymInit_InitDesc M2SymInit_GetFieldDesc (M2SymInit_InitDesc desc, unsigned int field);
     167                 :             : 
     168                 :             : /*
     169                 :             :    PopulateFields -
     170                 :             : */
     171                 :             : 
     172                 :             : extern "C" bool M2SymInit_SetFieldInitialized (M2SymInit_InitDesc desc, Lists_List fieldlist);
     173                 :             : 
     174                 :             : /*
     175                 :             :    SetFieldInitializedNo -
     176                 :             : */
     177                 :             : 
     178                 :             : extern "C" bool M2SymInit_GetFieldInitialized (M2SymInit_InitDesc desc, Lists_List fieldlist);
     179                 :             : 
     180                 :             : /*
     181                 :             :    ScopeBlockVariableAnalysis - checks to see whether a variable is
     182                 :             :                                 read before it has been initialized.
     183                 :             : */
     184                 :             : 
     185                 :             : extern "C" void M2SymInit_ScopeBlockVariableAnalysis (unsigned int Scope, unsigned int Start, unsigned int End);
     186                 :             : 
     187                 :             : /*
     188                 :             :    PrintSymInit -
     189                 :             : */
     190                 :             : 
     191                 :             : extern "C" void M2SymInit_PrintSymInit (M2SymInit_InitDesc desc);
     192                 :             : 
     193                 :             : /*
     194                 :             :    KillFieldDesc -
     195                 :             : */
     196                 :             : 
     197                 :             : static void KillFieldDesc (Indexing_Index *fielddesc);
     198                 :             : 
     199                 :             : /*
     200                 :             :    PopulateFields -
     201                 :             : */
     202                 :             : 
     203                 :             : static void PopulateFields (M2SymInit_InitDesc__opaque desc, unsigned int recsym);
     204                 :             : 
     205                 :             : /*
     206                 :             :    TrySetInitialized -
     207                 :             : */
     208                 :             : 
     209                 :             : static void TrySetInitialized (M2SymInit_InitDesc__opaque desc);
     210                 :             : 
     211                 :             : /*
     212                 :             :    SetFieldInitializedNo -
     213                 :             : */
     214                 :             : 
     215                 :             : static bool SetFieldInitializedNo (M2SymInit_InitDesc__opaque desc, Lists_List fieldlist, unsigned int level);
     216                 :             : 
     217                 :             : /*
     218                 :             :    SetFieldInitializedNo -
     219                 :             : */
     220                 :             : 
     221                 :             : static bool GetFieldInitializedNo (M2SymInit_InitDesc__opaque desc, Lists_List fieldlist, unsigned int level);
     222                 :             : 
     223                 :             : /*
     224                 :             :    IsGlobalVar -
     225                 :             : */
     226                 :             : 
     227                 :             : static bool IsGlobalVar (unsigned int sym);
     228                 :             : 
     229                 :             : /*
     230                 :             :    RecordFieldContainsVarient -
     231                 :             : */
     232                 :             : 
     233                 :             : static bool RecordFieldContainsVarient (unsigned int sym, Lists_List visited);
     234                 :             : 
     235                 :             : /*
     236                 :             :    RecordContainsVarient -
     237                 :             : */
     238                 :             : 
     239                 :             : static bool RecordContainsVarient (unsigned int sym, Lists_List visited);
     240                 :             : 
     241                 :             : /*
     242                 :             :    VarContainsVarient -
     243                 :             : */
     244                 :             : 
     245                 :             : static bool VarContainsVarient (unsigned int sym, Lists_List visited);
     246                 :             : 
     247                 :             : /*
     248                 :             :    TypeContainsVarient -
     249                 :             : */
     250                 :             : 
     251                 :             : static bool TypeContainsVarient (unsigned int sym, Lists_List visited);
     252                 :             : 
     253                 :             : /*
     254                 :             :    ArrayContainsVarient -
     255                 :             : */
     256                 :             : 
     257                 :             : static bool ArrayContainsVarient (unsigned int sym, Lists_List visited);
     258                 :             : 
     259                 :             : /*
     260                 :             :    PointerContainsVarient -
     261                 :             : */
     262                 :             : 
     263                 :             : static bool PointerContainsVarient (unsigned int sym, Lists_List visited);
     264                 :             : 
     265                 :             : /*
     266                 :             :    doContainsVariant -
     267                 :             : */
     268                 :             : 
     269                 :             : static bool doContainsVariant (unsigned int sym, Lists_List visited);
     270                 :             : 
     271                 :             : /*
     272                 :             :    ContainsVariant - returns TRUE if type sym contains a variant record.
     273                 :             : */
     274                 :             : 
     275                 :             : static bool ContainsVariant (unsigned int sym);
     276                 :             : 
     277                 :             : /*
     278                 :             :    IssueConditional -
     279                 :             : */
     280                 :             : 
     281                 :             : static void IssueConditional (unsigned int quad, bool conditional);
     282                 :             : 
     283                 :             : /*
     284                 :             :    GenerateNoteFlow -
     285                 :             : */
     286                 :             : 
     287                 :             : static void GenerateNoteFlow (unsigned int n, bool warning);
     288                 :             : 
     289                 :             : /*
     290                 :             :    IssueWarning - issue a warning or note at tok location.
     291                 :             : */
     292                 :             : 
     293                 :             : static void IssueWarning (unsigned int tok, const char *before_, unsigned int _before_high, const char *after_, unsigned int _after_high, unsigned int sym, bool warning);
     294                 :             : 
     295                 :             : /*
     296                 :             :    IsUniqueWarning - return TRUE if a warning has not been issued at tok.
     297                 :             :                      It remembers tok and subsequent calls will always return FALSE.
     298                 :             : */
     299                 :             : 
     300                 :             : static bool IsUniqueWarning (unsigned int tok);
     301                 :             : 
     302                 :             : /*
     303                 :             :    CheckDeferredRecordAccess -
     304                 :             : */
     305                 :             : 
     306                 :             : static void CheckDeferredRecordAccess (unsigned int tok, unsigned int sym, bool canDereference, bool warning, unsigned int i);
     307                 :             : 
     308                 :             : /*
     309                 :             :    SetVarUninitialized - resets variable init state.
     310                 :             : */
     311                 :             : 
     312                 :             : static void SetVarUninitialized (unsigned int sym);
     313                 :             : 
     314                 :             : /*
     315                 :             :    ComponentFindVar -
     316                 :             : */
     317                 :             : 
     318                 :             : static unsigned int ComponentFindVar (unsigned int sym, bool *lvalue, unsigned int tok);
     319                 :             : 
     320                 :             : /*
     321                 :             :    ComponentCreateFieldList - builds a list of fields accessed by the component var.
     322                 :             :                               Each item in the list will be a field of incremental levels
     323                 :             :                               though a nested record.  It is not a list of fields
     324                 :             :                               at the same level.
     325                 :             : 
     326                 :             :                               foo = RECORD
     327                 :             :                                        v: RECORD
     328                 :             :                                              x, y: CARDINAL ;
     329                 :             :                                           END ;
     330                 :             :                                        w: CARDINAL ;
     331                 :             :                                     END ;
     332                 :             : 
     333                 :             :                               { v, x } for example and not { v, w }
     334                 :             : */
     335                 :             : 
     336                 :             : static Lists_List ComponentCreateFieldList (unsigned int sym);
     337                 :             : 
     338                 :             : /*
     339                 :             :    ComponentCreateFieldList - builds a list of fields accessed by the component var.
     340                 :             :                               Each item in the list will be a field of incremental levels
     341                 :             :                               though a nested record.  It is not a list of fields
     342                 :             :                               at the same level.
     343                 :             : 
     344                 :             :                               foo = RECORD
     345                 :             :                                        v: RECORD
     346                 :             :                                              x, y: CARDINAL ;
     347                 :             :                                           END ;
     348                 :             :                                        w: CARDINAL ;
     349                 :             :                                     END ;
     350                 :             : 
     351                 :             :                               { v, x } for example and not { v, w }
     352                 :             : */
     353                 :             : 
     354                 :             : static void ComponentBuildFieldList (Lists_List lst, unsigned int sym);
     355                 :             : 
     356                 :             : /*
     357                 :             :    deRefComponent -
     358                 :             : */
     359                 :             : 
     360                 :             : static unsigned int deRefComponent (unsigned int component, bool lvalue, unsigned int sym, unsigned int tok);
     361                 :             : 
     362                 :             : /*
     363                 :             :    SetVarComponentInitialized -
     364                 :             : */
     365                 :             : 
     366                 :             : static void SetVarComponentInitialized (unsigned int sym, unsigned int tok);
     367                 :             : 
     368                 :             : /*
     369                 :             :    GetVarComponentInitialized -
     370                 :             : */
     371                 :             : 
     372                 :             : static bool GetVarComponentInitialized (unsigned int sym, unsigned int tok);
     373                 :             : 
     374                 :             : /*
     375                 :             :    Trace -
     376                 :             : */
     377                 :             : 
     378                 :             : static void Trace (const char *message_, unsigned int _message_high, unsigned int sym);
     379                 :             : 
     380                 :             : /*
     381                 :             :    SetVarInitialized - if the variable has a left mode and can be dereferenced
     382                 :             :                        then set the left and right initialization state.
     383                 :             : */
     384                 :             : 
     385                 :             : static void SetVarInitialized (unsigned int sym, bool canDereference, unsigned int tok);
     386                 :             : 
     387                 :             : /*
     388                 :             :    doGetVarInitialized -
     389                 :             : */
     390                 :             : 
     391                 :             : static bool doGetVarInitialized (unsigned int sym, unsigned int tok);
     392                 :             : 
     393                 :             : /*
     394                 :             :    GetVarInitialized -
     395                 :             : */
     396                 :             : 
     397                 :             : static bool GetVarInitialized (unsigned int sym, unsigned int tok);
     398                 :             : 
     399                 :             : /*
     400                 :             :    IsExempt - returns TRUE if sym is a global variable or a parameter or
     401                 :             :               a variable with a variant record type.
     402                 :             : */
     403                 :             : 
     404                 :             : static bool IsExempt (unsigned int sym);
     405                 :             : 
     406                 :             : /*
     407                 :             :    CheckBinary -
     408                 :             : */
     409                 :             : 
     410                 :             : static void CheckBinary (unsigned int op1tok, unsigned int op1, unsigned int op2tok, unsigned int op2, unsigned int op3tok, unsigned int op3, bool warning, unsigned int i);
     411                 :             : 
     412                 :             : /*
     413                 :             :    CheckUnary -
     414                 :             : */
     415                 :             : 
     416                 :             : static void CheckUnary (unsigned int lhstok, unsigned int lhs, unsigned int rhstok, unsigned int rhs, bool warning, unsigned int i);
     417                 :             : 
     418                 :             : /*
     419                 :             :    CheckXIndr -
     420                 :             : */
     421                 :             : 
     422                 :             : static void CheckXIndr (unsigned int lhstok, unsigned int lhs, unsigned int type, unsigned int rhstok, unsigned int rhs, bool warning, unsigned int i);
     423                 :             : 
     424                 :             : /*
     425                 :             :    CheckIndrX -
     426                 :             : */
     427                 :             : 
     428                 :             : static void CheckIndrX (unsigned int lhstok, unsigned int lhs, unsigned int rhstok, unsigned int rhs, bool warning, unsigned int i);
     429                 :             : 
     430                 :             : /*
     431                 :             :    CheckRecordField -
     432                 :             : */
     433                 :             : 
     434                 :             : static void CheckRecordField (unsigned int op1);
     435                 :             : 
     436                 :             : /*
     437                 :             :    CheckLastForIterator -
     438                 :             : */
     439                 :             : 
     440                 :             : static void CheckLastForIterator (unsigned int op1tok, unsigned int op1, unsigned int op2tok, unsigned int op2, bool warning, unsigned int i);
     441                 :             : 
     442                 :             : /*
     443                 :             :    CheckBecomes -
     444                 :             : */
     445                 :             : 
     446                 :             : static void CheckBecomes (unsigned int destok, unsigned int des, unsigned int exprtok, unsigned int expr, bool warning, unsigned int i);
     447                 :             : 
     448                 :             : /*
     449                 :             :    CheckComparison -
     450                 :             : */
     451                 :             : 
     452                 :             : static void CheckComparison (unsigned int op1tok, unsigned int op1, unsigned int op2tok, unsigned int op2, bool warning, unsigned int i);
     453                 :             : 
     454                 :             : /*
     455                 :             :    CheckAddr -
     456                 :             : */
     457                 :             : 
     458                 :             : static void CheckAddr (unsigned int ptrtok, unsigned int ptr, unsigned int contenttok, unsigned int content);
     459                 :             : 
     460                 :             : /*
     461                 :             :    DefaultTokPos -
     462                 :             : */
     463                 :             : 
     464                 :             : static unsigned int DefaultTokPos (unsigned int preferredPos, unsigned int defaultPos);
     465                 :             : 
     466                 :             : /*
     467                 :             :    stop -
     468                 :             : */
     469                 :             : 
     470                 :             : static void stop (void);
     471                 :             : 
     472                 :             : /*
     473                 :             :    CheckReadBeforeInitQuad -
     474                 :             : */
     475                 :             : 
     476                 :             : static bool CheckReadBeforeInitQuad (unsigned int procSym, unsigned int quad, bool warning, unsigned int i);
     477                 :             : 
     478                 :             : /*
     479                 :             :    SetParameterVariablesInitialized - sets all shadow variables for parameters as
     480                 :             :                                       initialized.
     481                 :             : */
     482                 :             : 
     483                 :             : static void SetParameterVariablesInitialized (unsigned int procSym);
     484                 :             : 
     485                 :             : /*
     486                 :             :    FilterCheckReadBeforeInitQuad -
     487                 :             : */
     488                 :             : 
     489                 :             : static bool FilterCheckReadBeforeInitQuad (unsigned int procSym, unsigned int start, bool warning, unsigned int i);
     490                 :             : 
     491                 :             : /*
     492                 :             :    CheckReadBeforeInitFirstBasicBlock -
     493                 :             : */
     494                 :             : 
     495                 :             : static void CheckReadBeforeInitFirstBasicBlock (unsigned int procSym, unsigned int start, unsigned int end, bool warning, unsigned int i);
     496                 :             : 
     497                 :             : /*
     498                 :             :    bbArrayKill -
     499                 :             : */
     500                 :             : 
     501                 :             : static void bbArrayKill (void);
     502                 :             : 
     503                 :             : /*
     504                 :             :    DumpBBEntry -
     505                 :             : */
     506                 :             : 
     507                 :             : static void DumpBBEntry (M2SymInit_bbEntry bbPtr, unsigned int procSym);
     508                 :             : 
     509                 :             : /*
     510                 :             :    DumpBBArray -
     511                 :             : */
     512                 :             : 
     513                 :             : static void DumpBBArray (unsigned int procSym);
     514                 :             : 
     515                 :             : /*
     516                 :             :    DumpBBSequence -
     517                 :             : */
     518                 :             : 
     519                 :             : static void DumpBBSequence (Lists_List lst);
     520                 :             : 
     521                 :             : /*
     522                 :             :    trashParam -
     523                 :             : */
     524                 :             : 
     525                 :             : static void trashParam (unsigned int trashQuad);
     526                 :             : 
     527                 :             : /*
     528                 :             :    SetVarLRInitialized - this sets up an alias between the parameter
     529                 :             :                          value and the pointer for the case:
     530                 :             : 
     531                 :             :                          procedure foo (var shadow: PtrToType) ;
     532                 :             : 
     533                 :             :                          which allows shadow to be statically analyzed
     534                 :             :                          once it is re-assigned.
     535                 :             : */
     536                 :             : 
     537                 :             : static void SetVarLRInitialized (unsigned int param);
     538                 :             : 
     539                 :             : /*
     540                 :             :    TestBBSequence -
     541                 :             : */
     542                 :             : 
     543                 :             : static void TestBBSequence (unsigned int procSym, Lists_List lst);
     544                 :             : 
     545                 :             : /*
     546                 :             :    CreateBBPermultations -
     547                 :             : */
     548                 :             : 
     549                 :             : static void CreateBBPermultations (unsigned int procSym, unsigned int i, Lists_List lst);
     550                 :             : 
     551                 :             : /*
     552                 :             :    GetOp3 -
     553                 :             : */
     554                 :             : 
     555                 :             : static unsigned int GetOp3 (unsigned int quad);
     556                 :             : 
     557                 :             : /*
     558                 :             :    getBBindex - return the basic block index which starts with quad.
     559                 :             : */
     560                 :             : 
     561                 :             : static unsigned int getBBindex (unsigned int quad);
     562                 :             : 
     563                 :             : /*
     564                 :             :    GenerateCFG -
     565                 :             : */
     566                 :             : 
     567                 :             : static void GenerateCFG (void);
     568                 :             : 
     569                 :             : /*
     570                 :             :    NewEntry -
     571                 :             : */
     572                 :             : 
     573                 :             : static M2SymInit_bbEntry NewEntry (void);
     574                 :             : 
     575                 :             : /*
     576                 :             :    IsAllocate - return TRUE is sym is ALLOCATE.
     577                 :             : */
     578                 :             : 
     579                 :             : static bool IsAllocate (unsigned int sym);
     580                 :             : 
     581                 :             : /*
     582                 :             :    IsDeallocate - return TRUE is sym is DEALLOCATE.
     583                 :             : */
     584                 :             : 
     585                 :             : static bool IsDeallocate (unsigned int sym);
     586                 :             : 
     587                 :             : /*
     588                 :             :    DetectTrash -
     589                 :             : */
     590                 :             : 
     591                 :             : static void DetectTrash (M2SymInit_bbEntry bbPtr);
     592                 :             : 
     593                 :             : /*
     594                 :             :    AppendEntry -
     595                 :             : */
     596                 :             : 
     597                 :             : static void AppendEntry (M2BasicBlock_BasicBlock bb);
     598                 :             : 
     599                 :             : /*
     600                 :             :    DumpAlias -
     601                 :             : */
     602                 :             : 
     603                 :             : static void DumpAlias (Indexing_Index array, unsigned int aliasIndex);
     604                 :             : 
     605                 :             : /*
     606                 :             :    doDumpAliases -
     607                 :             : */
     608                 :             : 
     609                 :             : static void doDumpAliases (Indexing_Index array);
     610                 :             : 
     611                 :             : /*
     612                 :             :    DumpAliases -
     613                 :             : */
     614                 :             : 
     615                 :             : static void DumpAliases (void);
     616                 :             : 
     617                 :             : /*
     618                 :             :    newAlias -
     619                 :             : */
     620                 :             : 
     621                 :             : static M2SymInit_symAlias newAlias (void);
     622                 :             : 
     623                 :             : /*
     624                 :             :    initAlias -
     625                 :             : */
     626                 :             : 
     627                 :             : static M2SymInit_symAlias initAlias (unsigned int sym);
     628                 :             : 
     629                 :             : /*
     630                 :             :    killAlias -
     631                 :             : */
     632                 :             : 
     633                 :             : static void killAlias (M2SymInit_symAlias sa);
     634                 :             : 
     635                 :             : /*
     636                 :             :    initBlock -
     637                 :             : */
     638                 :             : 
     639                 :             : static void initBlock (void);
     640                 :             : 
     641                 :             : /*
     642                 :             :    killBlock -
     643                 :             : */
     644                 :             : 
     645                 :             : static void killBlock (void);
     646                 :             : 
     647                 :             : /*
     648                 :             :    killBlock -
     649                 :             : */
     650                 :             : 
     651                 :             : static void doKillBlock (Indexing_Index *array);
     652                 :             : 
     653                 :             : /*
     654                 :             :    addAlias -
     655                 :             : */
     656                 :             : 
     657                 :             : static void addAlias (Indexing_Index array, unsigned int sym, unsigned int aliased);
     658                 :             : 
     659                 :             : /*
     660                 :             :    lookupAlias -
     661                 :             : */
     662                 :             : 
     663                 :             : static M2SymInit_symAlias lookupAlias (Indexing_Index array, unsigned int sym);
     664                 :             : 
     665                 :             : /*
     666                 :             :    doGetAlias -
     667                 :             : */
     668                 :             : 
     669                 :             : static unsigned int doGetAlias (Indexing_Index array, unsigned int sym);
     670                 :             : 
     671                 :             : /*
     672                 :             :    getLAlias - attempts to looks up an alias which is not a temporary variable.
     673                 :             : */
     674                 :             : 
     675                 :             : static unsigned int getLAlias (unsigned int sym);
     676                 :             : 
     677                 :             : /*
     678                 :             :    SetupLAlias -
     679                 :             : */
     680                 :             : 
     681                 :             : static void SetupLAlias (unsigned int des, unsigned int exp);
     682                 :             : 
     683                 :             : /*
     684                 :             :    SetupIndr -
     685                 :             : */
     686                 :             : 
     687                 :             : static void SetupIndr (unsigned int ptr, unsigned int content);
     688                 :             : 
     689                 :             : /*
     690                 :             :    getContent - attempts to return the content pointed to by ptr.
     691                 :             :                 sym is the original symbol and ptr will be the equivalent lvalue.
     692                 :             : */
     693                 :             : 
     694                 :             : static unsigned int getContent (unsigned int ptr, unsigned int sym, unsigned int tok);
     695                 :             : 
     696                 :             : /*
     697                 :             :    init -
     698                 :             : */
     699                 :             : 
     700                 :             : static void init (void);
     701                 :             : 
     702                 :             : 
     703                 :             : /*
     704                 :             :    KillFieldDesc -
     705                 :             : */
     706                 :             : 
     707                 :           0 : static void KillFieldDesc (Indexing_Index *fielddesc)
     708                 :             : {
     709                 :           0 :   unsigned int i;
     710                 :           0 :   unsigned int h;
     711                 :           0 :   M2SymInit_InitDesc__opaque id;
     712                 :             : 
     713                 :           0 :   i = 1;
     714                 :           0 :   h = Indexing_HighIndice ((*fielddesc));
     715                 :           0 :   while (i <= h)
     716                 :             :     {
     717                 :           0 :       id = static_cast<M2SymInit_InitDesc__opaque> (Indexing_GetIndice ((*fielddesc), i));
     718                 :           0 :       M2SymInit_KillSymInit (reinterpret_cast<M2SymInit_InitDesc *> (&id));
     719                 :           0 :       i += 1;
     720                 :             :     }
     721                 :           0 :   (*fielddesc) = Indexing_KillIndex ((*fielddesc));
     722                 :           0 : }
     723                 :             : 
     724                 :             : 
     725                 :             : /*
     726                 :             :    PopulateFields -
     727                 :             : */
     728                 :             : 
     729                 :       68824 : static void PopulateFields (M2SymInit_InitDesc__opaque desc, unsigned int recsym)
     730                 :             : {
     731                 :       68824 :   unsigned int field;
     732                 :       68824 :   unsigned int i;
     733                 :       68824 :   M2SymInit_InitDesc__opaque fdesc;
     734                 :             : 
     735                 :       68824 :   M2Debug_Assert (SymbolTable_IsRecord (recsym));
     736                 :       68824 :   i = 1;
     737                 :      332252 :   do {
     738                 :      332252 :     field = SymbolTable_GetNth (recsym, i);
     739                 :      332252 :     if (field != SymbolTable_NulSym)
     740                 :             :       {
     741                 :      263428 :         fdesc = static_cast<M2SymInit_InitDesc__opaque> (M2SymInit_InitSymInit ());
     742                 :      263428 :         M2SymInit_ConfigSymInit (static_cast<M2SymInit_InitDesc> (fdesc), field);
     743                 :      263428 :         Indexing_IncludeIndiceIntoIndex (desc->rec.fieldDesc, reinterpret_cast <void *> (fdesc));
     744                 :      263428 :         i += 1;
     745                 :             :       }
     746                 :      332252 :   } while (! (field == SymbolTable_NulSym));
     747                 :       68824 : }
     748                 :             : 
     749                 :             : 
     750                 :             : /*
     751                 :             :    TrySetInitialized -
     752                 :             : */
     753                 :             : 
     754                 :         936 : static void TrySetInitialized (M2SymInit_InitDesc__opaque desc)
     755                 :             : {
     756                 :         936 :   unsigned int i;
     757                 :         936 :   unsigned int h;
     758                 :         936 :   M2SymInit_InitDesc__opaque fdesc;
     759                 :             : 
     760                 :         936 :   h = Indexing_HighIndice (desc->rec.fieldDesc);
     761                 :         936 :   i = 1;
     762                 :        2712 :   while (i <= h)
     763                 :             :     {
     764                 :        1692 :       fdesc = static_cast<M2SymInit_InitDesc__opaque> (Indexing_GetIndice (desc->rec.fieldDesc, i));
     765                 :        1692 :       if (! fdesc->initialized)
     766                 :             :         {
     767                 :             :           return;
     768                 :             :         }
     769                 :         840 :       i += 1;
     770                 :             :     }
     771                 :          84 :   desc->initialized = true;
     772                 :             : }
     773                 :             : 
     774                 :             : 
     775                 :             : /*
     776                 :             :    SetFieldInitializedNo -
     777                 :             : */
     778                 :             : 
     779                 :         900 : static bool SetFieldInitializedNo (M2SymInit_InitDesc__opaque desc, Lists_List fieldlist, unsigned int level)
     780                 :             : {
     781                 :         900 :   unsigned int nsym;
     782                 :         900 :   M2SymInit_InitDesc__opaque fdesc;
     783                 :             : 
     784                 :         900 :   if (level > (Lists_NoOfItemsInList (fieldlist)))
     785                 :             :     {
     786                 :             :       return false;
     787                 :             :     }
     788                 :             :   else
     789                 :             :     {
     790                 :         900 :       nsym = static_cast<unsigned int> (Lists_GetItemFromList (fieldlist, level));
     791                 :         900 :       fdesc = static_cast<M2SymInit_InitDesc__opaque> (M2SymInit_GetFieldDesc (static_cast<M2SymInit_InitDesc> (desc), nsym));
     792                 :         900 :       if (fdesc == NULL)
     793                 :             :         {
     794                 :             :           return false;
     795                 :             :         }
     796                 :         828 :       else if (level == (Lists_NoOfItemsInList (fieldlist)))
     797                 :             :         {
     798                 :             :           /* avoid dangling else.  */
     799                 :         612 :           M2SymInit_SetInitialized (static_cast<M2SymInit_InitDesc> (fdesc));
     800                 :         612 :           TrySetInitialized (desc);
     801                 :         612 :           return desc->initialized;
     802                 :             :         }
     803                 :             :       else
     804                 :             :         {
     805                 :             :           /* avoid dangling else.  */
     806                 :         216 :           if (SetFieldInitializedNo (fdesc, fieldlist, level+1))
     807                 :             :             {}  /* empty.  */
     808                 :         216 :           TrySetInitialized (desc);
     809                 :         216 :           return desc->initialized;
     810                 :             :         }
     811                 :             :     }
     812                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
     813                 :             :   __builtin_unreachable ();
     814                 :             : }
     815                 :             : 
     816                 :             : 
     817                 :             : /*
     818                 :             :    SetFieldInitializedNo -
     819                 :             : */
     820                 :             : 
     821                 :         204 : static bool GetFieldInitializedNo (M2SymInit_InitDesc__opaque desc, Lists_List fieldlist, unsigned int level)
     822                 :             : {
     823                 :         372 :   unsigned int nsym;
     824                 :         372 :   M2SymInit_InitDesc__opaque fdesc;
     825                 :             : 
     826                 :         372 :   if (desc->initialized)
     827                 :             :     {
     828                 :             :       return true;
     829                 :             :     }
     830                 :         324 :   else if (level > (Lists_NoOfItemsInList (fieldlist)))
     831                 :             :     {
     832                 :             :       /* avoid dangling else.  */
     833                 :             :       return false;
     834                 :             :     }
     835                 :             :   else
     836                 :             :     {
     837                 :             :       /* avoid dangling else.  */
     838                 :         180 :       nsym = static_cast<unsigned int> (Lists_GetItemFromList (fieldlist, level));
     839                 :         180 :       fdesc = static_cast<M2SymInit_InitDesc__opaque> (M2SymInit_GetFieldDesc (static_cast<M2SymInit_InitDesc> (desc), nsym));
     840                 :         180 :       if (fdesc == NULL)
     841                 :             :         {
     842                 :             :           /* The pointer variable maybe uninitialized and hence we cannot
     843                 :             :             find the record variable.  */
     844                 :             :           return false;
     845                 :             :         }
     846                 :         180 :       else if (fdesc->initialized)
     847                 :             :         {
     848                 :             :           /* avoid dangling else.  */
     849                 :             :           return true;
     850                 :             :         }
     851                 :             :       else
     852                 :             :         {
     853                 :             :           /* avoid dangling else.  */
     854                 :         168 :           return GetFieldInitializedNo (fdesc, fieldlist, level+1);
     855                 :             :         }
     856                 :             :     }
     857                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
     858                 :             :   __builtin_unreachable ();
     859                 :             : }
     860                 :             : 
     861                 :             : 
     862                 :             : /*
     863                 :             :    IsGlobalVar -
     864                 :             : */
     865                 :             : 
     866                 :        3610 : static bool IsGlobalVar (unsigned int sym)
     867                 :             : {
     868                 :        3610 :   return (SymbolTable_IsVar (sym)) && (! (SymbolTable_IsProcedure (SymbolTable_GetVarScope (sym))));
     869                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
     870                 :             :   __builtin_unreachable ();
     871                 :             : }
     872                 :             : 
     873                 :             : 
     874                 :             : /*
     875                 :             :    RecordFieldContainsVarient -
     876                 :             : */
     877                 :             : 
     878                 :        2052 : static bool RecordFieldContainsVarient (unsigned int sym, Lists_List visited)
     879                 :             : {
     880                 :        2052 :   M2Debug_Assert (SymbolTable_IsRecordField (sym));
     881                 :        2052 :   if (doContainsVariant (SymbolTable_GetSType (sym), visited))
     882                 :             :     {
     883                 :             :       return true;
     884                 :             :     }
     885                 :        2052 :   return (SymbolTable_GetVarient (sym)) != SymbolTable_NulSym;
     886                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
     887                 :             :   __builtin_unreachable ();
     888                 :             : }
     889                 :             : 
     890                 :             : 
     891                 :             : /*
     892                 :             :    RecordContainsVarient -
     893                 :             : */
     894                 :             : 
     895                 :         972 : static bool RecordContainsVarient (unsigned int sym, Lists_List visited)
     896                 :             : {
     897                 :         972 :   unsigned int i;
     898                 :         972 :   unsigned int fieldsym;
     899                 :             : 
     900                 :         972 :   M2Debug_Assert (SymbolTable_IsRecord (sym));
     901                 :         972 :   i = 1;
     902                 :        3024 :   do {
     903                 :        3024 :     fieldsym = SymbolTable_GetNth (sym, i);
     904                 :        3024 :     if (fieldsym != SymbolTable_NulSym)
     905                 :             :       {
     906                 :        2052 :         if (SymbolTable_IsRecordField (fieldsym))
     907                 :             :           {
     908                 :             :             /* avoid dangling else.  */
     909                 :        2052 :             if (RecordFieldContainsVarient (fieldsym, visited))
     910                 :             :               {
     911                 :             :                 return true;
     912                 :             :               }
     913                 :             :           }
     914                 :           0 :         else if (SymbolTable_IsVarient (fieldsym))
     915                 :             :           {
     916                 :             :             /* avoid dangling else.  */
     917                 :             :             return true;
     918                 :             :           }
     919                 :        2052 :         i += 1;
     920                 :             :       }
     921                 :        3024 :   } while (! (fieldsym == SymbolTable_NulSym));
     922                 :             :   return false;
     923                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
     924                 :             :   __builtin_unreachable ();
     925                 :             : }
     926                 :             : 
     927                 :             : 
     928                 :             : /*
     929                 :             :    VarContainsVarient -
     930                 :             : */
     931                 :             : 
     932                 :        3406 : static bool VarContainsVarient (unsigned int sym, Lists_List visited)
     933                 :             : {
     934                 :        3406 :   M2Debug_Assert (SymbolTable_IsVar (sym));
     935                 :        3406 :   return doContainsVariant (SymbolTable_GetSType (sym), visited);
     936                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
     937                 :             :   __builtin_unreachable ();
     938                 :             : }
     939                 :             : 
     940                 :             : 
     941                 :             : /*
     942                 :             :    TypeContainsVarient -
     943                 :             : */
     944                 :             : 
     945                 :        3406 : static bool TypeContainsVarient (unsigned int sym, Lists_List visited)
     946                 :             : {
     947                 :        3406 :   M2Debug_Assert (SymbolTable_IsType (sym));
     948                 :        3406 :   return doContainsVariant (SymbolTable_GetSType (sym), visited);
     949                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
     950                 :             :   __builtin_unreachable ();
     951                 :             : }
     952                 :             : 
     953                 :             : 
     954                 :             : /*
     955                 :             :    ArrayContainsVarient -
     956                 :             : */
     957                 :             : 
     958                 :          12 : static bool ArrayContainsVarient (unsigned int sym, Lists_List visited)
     959                 :             : {
     960                 :          12 :   M2Debug_Assert (SymbolTable_IsArray (sym));
     961                 :          12 :   return doContainsVariant (SymbolTable_GetSType (sym), visited);
     962                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
     963                 :             :   __builtin_unreachable ();
     964                 :             : }
     965                 :             : 
     966                 :             : 
     967                 :             : /*
     968                 :             :    PointerContainsVarient -
     969                 :             : */
     970                 :             : 
     971                 :        2488 : static bool PointerContainsVarient (unsigned int sym, Lists_List visited)
     972                 :             : {
     973                 :        2488 :   M2Debug_Assert (SymbolTable_IsPointer (sym));
     974                 :        2488 :   return doContainsVariant (SymbolTable_GetSType (sym), visited);
     975                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
     976                 :             :   __builtin_unreachable ();
     977                 :             : }
     978                 :             : 
     979                 :             : 
     980                 :             : /*
     981                 :             :    doContainsVariant -
     982                 :             : */
     983                 :             : 
     984                 :       14770 : static bool doContainsVariant (unsigned int sym, Lists_List visited)
     985                 :             : {
     986                 :       14770 :   if ((sym != SymbolTable_NulSym) && (! (Lists_IsItemInList (visited, sym))))
     987                 :             :     {
     988                 :       10296 :       Lists_IncludeItemIntoList (visited, sym);
     989                 :       10296 :       if (SymbolTable_IsVar (sym))
     990                 :             :         {
     991                 :        3406 :           return VarContainsVarient (sym, visited);
     992                 :             :         }
     993                 :        6890 :       else if (SymbolTable_IsRecord (sym))
     994                 :             :         {
     995                 :             :           /* avoid dangling else.  */
     996                 :         972 :           return RecordContainsVarient (sym, visited);
     997                 :             :         }
     998                 :        5918 :       else if (SymbolTable_IsPointer (sym))
     999                 :             :         {
    1000                 :             :           /* avoid dangling else.  */
    1001                 :        2488 :           return PointerContainsVarient (sym, visited);
    1002                 :             :         }
    1003                 :        3430 :       else if (SymbolTable_IsArray (sym))
    1004                 :             :         {
    1005                 :             :           /* avoid dangling else.  */
    1006                 :          12 :           return ArrayContainsVarient (sym, visited);
    1007                 :             :         }
    1008                 :        3418 :       else if (SymbolTable_IsType (sym))
    1009                 :             :         {
    1010                 :             :           /* avoid dangling else.  */
    1011                 :        3406 :           return TypeContainsVarient (sym, visited);
    1012                 :             :         }
    1013                 :             :     }
    1014                 :             :   return false;
    1015                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    1016                 :             :   __builtin_unreachable ();
    1017                 :             : }
    1018                 :             : 
    1019                 :             : 
    1020                 :             : /*
    1021                 :             :    ContainsVariant - returns TRUE if type sym contains a variant record.
    1022                 :             : */
    1023                 :             : 
    1024                 :        3406 : static bool ContainsVariant (unsigned int sym)
    1025                 :             : {
    1026                 :        3406 :   Lists_List visited;
    1027                 :        3406 :   bool result;
    1028                 :             : 
    1029                 :        3406 :   Lists_InitList (&visited);
    1030                 :        3406 :   result = doContainsVariant (sym, visited);
    1031                 :        3406 :   Lists_KillList (&visited);
    1032                 :        3406 :   return result;
    1033                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    1034                 :             :   __builtin_unreachable ();
    1035                 :             : }
    1036                 :             : 
    1037                 :             : 
    1038                 :             : /*
    1039                 :             :    IssueConditional -
    1040                 :             : */
    1041                 :             : 
    1042                 :           9 : static void IssueConditional (unsigned int quad, bool conditional)
    1043                 :             : {
    1044                 :           9 :   M2Quads_QuadOperator op;
    1045                 :           9 :   unsigned int op1;
    1046                 :           9 :   unsigned int op2;
    1047                 :           9 :   unsigned int op3;
    1048                 :           9 :   unsigned int op1tok;
    1049                 :           9 :   unsigned int op2tok;
    1050                 :           9 :   unsigned int op3tok;
    1051                 :           9 :   unsigned int qtok;
    1052                 :           9 :   bool constExpr;
    1053                 :           9 :   bool overflowChecking;
    1054                 :           9 :   DynamicStrings_String s;
    1055                 :             : 
    1056                 :           9 :   M2Quads_GetQuadOtok (quad, &qtok, &op, &op1, &op2, &op3, &overflowChecking, &constExpr, &op1tok, &op2tok, &op3tok);
    1057                 :           9 :   if (IsUniqueWarning (qtok))
    1058                 :             :     {
    1059                 :          14 :       op1tok = DefaultTokPos (op1tok, qtok);
    1060                 :          14 :       op2tok = DefaultTokPos (op2tok, qtok);
    1061                 :          14 :       op3tok = DefaultTokPos (op3tok, qtok);
    1062                 :           7 :       if (! conditional)
    1063                 :             :         {
    1064                 :           7 :           op = M2Quads_Opposite (op);
    1065                 :             :         }
    1066                 :           7 :       s = DynamicStrings_InitString ((const char *) "depending upon the result of {%1Oad} ", 37);
    1067                 :           7 :       s = DynamicStrings_ConCat (s, DynamicStrings_Mark (M2Quads_GetM2OperatorDesc (op)));
    1068                 :           7 :       s = DynamicStrings_ConCat (s, DynamicStrings_InitString ((const char *) " {%2ad}", 7));
    1069                 :           7 :       M2MetaError_MetaErrorStringT2 (qtok, s, op1, op2);
    1070                 :             :     }
    1071                 :           9 : }
    1072                 :             : 
    1073                 :             : 
    1074                 :             : /*
    1075                 :             :    GenerateNoteFlow -
    1076                 :             : */
    1077                 :             : 
    1078                 :         218 : static void GenerateNoteFlow (unsigned int n, bool warning)
    1079                 :             : {
    1080                 :         218 :   unsigned int i;
    1081                 :         218 :   M2SymInit_bbEntry ip1Ptr;
    1082                 :         218 :   M2SymInit_bbEntry iPtr;
    1083                 :             : 
    1084                 :         218 :   if (! warning)
    1085                 :             :     {
    1086                 :             :       /* Only issue flow messages for non warnings.  */
    1087                 :             :       i = 1;
    1088                 :          46 :       while (i <= n)
    1089                 :             :         {
    1090                 :          38 :           iPtr = static_cast<M2SymInit_bbEntry> (Indexing_GetIndice (bbArray, i));
    1091                 :          38 :           if (iPtr->endCond)
    1092                 :             :             {
    1093                 :          11 :               if (i < n)
    1094                 :             :                 {
    1095                 :           9 :                   ip1Ptr = static_cast<M2SymInit_bbEntry> (Indexing_GetIndice (bbArray, i+1));
    1096                 :           9 :                   IssueConditional (iPtr->end, iPtr->condBB == ip1Ptr->indexBB);
    1097                 :             :                 }
    1098                 :             :             }
    1099                 :          38 :           i += 1;
    1100                 :             :         }
    1101                 :             :     }
    1102                 :         218 : }
    1103                 :             : 
    1104                 :             : 
    1105                 :             : /*
    1106                 :             :    IssueWarning - issue a warning or note at tok location.
    1107                 :             : */
    1108                 :             : 
    1109                 :         218 : static void IssueWarning (unsigned int tok, const char *before_, unsigned int _before_high, const char *after_, unsigned int _after_high, unsigned int sym, bool warning)
    1110                 :             : {
    1111                 :         218 :   DynamicStrings_String s;
    1112                 :         218 :   char before[_before_high+1];
    1113                 :         218 :   char after[_after_high+1];
    1114                 :             : 
    1115                 :             :   /* make a local copy of each unbounded array.  */
    1116                 :         218 :   memcpy (before, before_, _before_high+1);
    1117                 :         218 :   memcpy (after, after_, _after_high+1);
    1118                 :             : 
    1119                 :         436 :   s = DynamicStrings_InitString ((const char *) before, _before_high);
    1120                 :         218 :   if (warning)
    1121                 :             :     {
    1122                 :         210 :       s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "{%1Wad}", 7)));
    1123                 :             :     }
    1124                 :             :   else
    1125                 :             :     {
    1126                 :           8 :       s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "{%1Oad}", 7)));
    1127                 :             :     }
    1128                 :         218 :   s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) after, _after_high)));
    1129                 :         218 :   M2MetaError_MetaErrorStringT1 (tok, s, sym);
    1130                 :         218 : }
    1131                 :             : 
    1132                 :             : 
    1133                 :             : /*
    1134                 :             :    IsUniqueWarning - return TRUE if a warning has not been issued at tok.
    1135                 :             :                      It remembers tok and subsequent calls will always return FALSE.
    1136                 :             : */
    1137                 :             : 
    1138                 :         292 : static bool IsUniqueWarning (unsigned int tok)
    1139                 :             : {
    1140                 :         292 :   if (! (Lists_IsItemInList (errorList, tok)))
    1141                 :             :     {
    1142                 :         201 :       Lists_IncludeItemIntoList (errorList, tok);
    1143                 :         201 :       return true;
    1144                 :             :     }
    1145                 :             :   else
    1146                 :             :     {
    1147                 :             :       return false;
    1148                 :             :     }
    1149                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    1150                 :             :   __builtin_unreachable ();
    1151                 :             : }
    1152                 :             : 
    1153                 :             : 
    1154                 :             : /*
    1155                 :             :    CheckDeferredRecordAccess -
    1156                 :             : */
    1157                 :             : 
    1158                 :        8903 : static void CheckDeferredRecordAccess (unsigned int tok, unsigned int sym, bool canDereference, bool warning, unsigned int i)
    1159                 :             : {
    1160                 :        8903 :   bool unique;
    1161                 :             : 
    1162                 :        8903 :   if (SymbolTable_IsVar (sym))
    1163                 :             :     {
    1164                 :        3196 :       if (Debugging)
    1165                 :             :         {
    1166                 :             :           Trace ((const char *) "CheckDeferredRecordAccess %d\\n", 30, sym);
    1167                 :             :           M2GCCDeclare_PrintSym (sym);
    1168                 :             :           if (canDereference)
    1169                 :             :             {
    1170                 :             :               M2Printf_printf1 ((const char *) "checkReadInit (%d, true)\\n", 26, (const unsigned char *) &sym, (sizeof (sym)-1));
    1171                 :             :             }
    1172                 :             :           else
    1173                 :             :             {
    1174                 :             :               M2Printf_printf1 ((const char *) "checkReadInit (%d, false)\\n", 27, (const unsigned char *) &sym, (sizeof (sym)-1));
    1175                 :             :             }
    1176                 :             :         }
    1177                 :        3196 :       if (IsExempt (sym))
    1178                 :             :         {
    1179                 :         414 :           Trace ((const char *) "checkReadInit sym is a parameter or not a local variable (%d)", 61, sym);
    1180                 :             :           /* We assume parameters have been initialized.  */
    1181                 :         414 :           SymbolTable_PutVarInitialized (sym, SymbolTable_LeftValue);
    1182                 :             :           /* SetVarInitialized (sym, TRUE)  */
    1183                 :         414 :           SymbolTable_PutVarInitialized (sym, SymbolTable_RightValue);
    1184                 :             :         }
    1185                 :        2782 :       else if (SymbolTable_IsUnbounded (SymbolTable_GetSType (sym)))
    1186                 :             :         {
    1187                 :             :           /* avoid dangling else.  */
    1188                 :           0 :           SetVarInitialized (sym, true, tok);
    1189                 :             :         }
    1190                 :        2782 :       else if (SymbolTable_IsComponent (sym))
    1191                 :             :         {
    1192                 :             :           /* avoid dangling else.  */
    1193                 :         264 :           Trace ((const char *) "checkReadInit IsComponent (%d) is true)", 39, sym);
    1194                 :         264 :           if ((! (GetVarComponentInitialized (sym, tok))) && (IsUniqueWarning (tok)))
    1195                 :             :             {
    1196                 :         126 :               GenerateNoteFlow (i, warning);
    1197                 :         126 :               IssueWarning (tok, (const char *) "attempting to access ", 21, (const char *) " before it has been initialized", 31, sym, warning);
    1198                 :             :             }
    1199                 :             :         }
    1200                 :        2518 :       else if (((SymbolTable_GetMode (sym)) == SymbolTable_LeftValue) && canDereference)
    1201                 :             :         {
    1202                 :             :           /* avoid dangling else.  */
    1203                 :          30 :           Trace ((const char *) "checkReadInit GetMode (%d) = LeftValue and canDereference (LeftValue and RightValue VarCheckReadInit)", 101, sym);
    1204                 :          30 :           unique = true;
    1205                 :          30 :           if (! (SymbolTable_VarCheckReadInit (sym, SymbolTable_LeftValue)))
    1206                 :             :             {
    1207                 :           0 :               unique = IsUniqueWarning (tok);
    1208                 :           0 :               if (unique)
    1209                 :             :                 {
    1210                 :           0 :                   GenerateNoteFlow (i, warning);
    1211                 :           0 :                   IssueWarning (tok, (const char *) "attempting to access the address of ", 36, (const char *) " before it has been initialized", 31, sym, warning);
    1212                 :             :                 }
    1213                 :             :             }
    1214                 :          30 :           if (! (SymbolTable_VarCheckReadInit (sym, SymbolTable_RightValue)))
    1215                 :             :             {
    1216                 :          24 :               if (unique)
    1217                 :             :                 {
    1218                 :          24 :                   GenerateNoteFlow (i, warning);
    1219                 :          24 :                   IssueWarning (tok, (const char *) "attempting to access ", 21, (const char *) " before it has been initialized", 31, sym, warning);
    1220                 :             :                 }
    1221                 :             :             }
    1222                 :             :         }
    1223                 :             :       else
    1224                 :             :         {
    1225                 :             :           /* avoid dangling else.  */
    1226                 :        2488 :           Trace ((const char *) "checkReadInit call VarCheckReadInit using GetMode (%d)", 54, sym);
    1227                 :        2488 :           if ((! (SymbolTable_VarCheckReadInit (sym, SymbolTable_GetMode (sym)))) && (IsUniqueWarning (tok)))
    1228                 :             :             {
    1229                 :          68 :               GenerateNoteFlow (i, warning);
    1230                 :          68 :               IssueWarning (tok, (const char *) "attempting to access ", 21, (const char *) " before it has been initialized", 31, sym, warning);
    1231                 :             :             }
    1232                 :             :         }
    1233                 :             :     }
    1234                 :        8903 : }
    1235                 :             : 
    1236                 :             : 
    1237                 :             : /*
    1238                 :             :    SetVarUninitialized - resets variable init state.
    1239                 :             : */
    1240                 :             : 
    1241                 :       64923 : static void SetVarUninitialized (unsigned int sym)
    1242                 :             : {
    1243                 :       64923 :   if (SymbolTable_IsVar (sym))
    1244                 :             :     {
    1245                 :       10660 :       if (! (SymbolTable_IsUnbounded (SymbolTable_GetSType (sym))))
    1246                 :             :         {
    1247                 :       10408 :           SymbolTable_VarInitState (sym);
    1248                 :             :         }
    1249                 :             :     }
    1250                 :       64923 : }
    1251                 :             : 
    1252                 :             : 
    1253                 :             : /*
    1254                 :             :    ComponentFindVar -
    1255                 :             : */
    1256                 :             : 
    1257                 :         972 : static unsigned int ComponentFindVar (unsigned int sym, bool *lvalue, unsigned int tok)
    1258                 :             : {
    1259                 :        1224 :   unsigned int nsym;
    1260                 :        1224 :   unsigned int i;
    1261                 :             : 
    1262                 :        1224 :   i = 1;
    1263                 :        1224 :   do {
    1264                 :        1224 :     nsym = SymbolTable_GetNth (sym, i);
    1265                 :        1224 :     (*lvalue) = (SymbolTable_GetMode (nsym)) == SymbolTable_LeftValue;
    1266                 :        1224 :     nsym = getLAlias (nsym);
    1267                 :        1224 :     if (nsym == M2Base_Nil)
    1268                 :             :       {
    1269                 :          36 :         M2MetaError_MetaErrorT1 (tok, (const char *) "attempting to dereference {%1Wad} which will be a {%kNIL} pointer", 65, sym);
    1270                 :          36 :         return SymbolTable_NulSym;
    1271                 :             :       }
    1272                 :        1188 :     else if ((nsym != SymbolTable_NulSym) && (SymbolTable_IsVar (nsym)))
    1273                 :             :       {
    1274                 :             :         /* avoid dangling else.  */
    1275                 :        1188 :         if ((nsym != sym) && (SymbolTable_IsComponent (nsym)))
    1276                 :             :           {
    1277                 :             :             return ComponentFindVar (nsym, lvalue, tok);
    1278                 :             :           }
    1279                 :             :         else
    1280                 :             :           {
    1281                 :         936 :             return nsym;
    1282                 :             :           }
    1283                 :             :       }
    1284                 :           0 :     i += 1;
    1285                 :           0 :   } while (! (nsym == SymbolTable_NulSym));
    1286                 :             :   return SymbolTable_NulSym;
    1287                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    1288                 :             :   __builtin_unreachable ();
    1289                 :             : }
    1290                 :             : 
    1291                 :             : 
    1292                 :             : /*
    1293                 :             :    ComponentCreateFieldList - builds a list of fields accessed by the component var.
    1294                 :             :                               Each item in the list will be a field of incremental levels
    1295                 :             :                               though a nested record.  It is not a list of fields
    1296                 :             :                               at the same level.
    1297                 :             : 
    1298                 :             :                               foo = RECORD
    1299                 :             :                                        v: RECORD
    1300                 :             :                                              x, y: CARDINAL ;
    1301                 :             :                                           END ;
    1302                 :             :                                        w: CARDINAL ;
    1303                 :             :                                     END ;
    1304                 :             : 
    1305                 :             :                               { v, x } for example and not { v, w }
    1306                 :             : */
    1307                 :             : 
    1308                 :         888 : static Lists_List ComponentCreateFieldList (unsigned int sym)
    1309                 :             : {
    1310                 :         888 :   Lists_List lst;
    1311                 :             : 
    1312                 :         888 :   Lists_InitList (&lst);
    1313                 :         888 :   if ((SymbolTable_IsVar (sym)) && (SymbolTable_IsComponent (sym)))
    1314                 :             :     {
    1315                 :         888 :       ComponentBuildFieldList (lst, sym);
    1316                 :             :     }
    1317                 :         888 :   return lst;
    1318                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    1319                 :             :   __builtin_unreachable ();
    1320                 :             : }
    1321                 :             : 
    1322                 :             : 
    1323                 :             : /*
    1324                 :             :    ComponentCreateFieldList - builds a list of fields accessed by the component var.
    1325                 :             :                               Each item in the list will be a field of incremental levels
    1326                 :             :                               though a nested record.  It is not a list of fields
    1327                 :             :                               at the same level.
    1328                 :             : 
    1329                 :             :                               foo = RECORD
    1330                 :             :                                        v: RECORD
    1331                 :             :                                              x, y: CARDINAL ;
    1332                 :             :                                           END ;
    1333                 :             :                                        w: CARDINAL ;
    1334                 :             :                                     END ;
    1335                 :             : 
    1336                 :             :                               { v, x } for example and not { v, w }
    1337                 :             : */
    1338                 :             : 
    1339                 :        1140 : static void ComponentBuildFieldList (Lists_List lst, unsigned int sym)
    1340                 :             : {
    1341                 :        1140 :   unsigned int i;
    1342                 :        1140 :   unsigned int nsym;
    1343                 :             : 
    1344                 :        1140 :   i = 1;
    1345                 :        3420 :   do {
    1346                 :        3420 :     nsym = SymbolTable_GetNth (sym, i);
    1347                 :        3420 :     if (nsym != SymbolTable_NulSym)
    1348                 :             :       {
    1349                 :        2280 :         if (SymbolTable_IsComponent (nsym))
    1350                 :             :           {
    1351                 :         252 :             ComponentBuildFieldList (lst, nsym);
    1352                 :             :           }
    1353                 :        2028 :         else if (SymbolTable_IsRecordField (nsym))
    1354                 :             :           {
    1355                 :             :             /* avoid dangling else.  */
    1356                 :        1140 :             Lists_IncludeItemIntoList (lst, nsym);
    1357                 :             :           }
    1358                 :        2280 :         i += 1;
    1359                 :             :       }
    1360                 :        3420 :   } while (! (nsym == SymbolTable_NulSym));
    1361                 :        1140 : }
    1362                 :             : 
    1363                 :             : 
    1364                 :             : /*
    1365                 :             :    deRefComponent -
    1366                 :             : */
    1367                 :             : 
    1368                 :         954 : static unsigned int deRefComponent (unsigned int component, bool lvalue, unsigned int sym, unsigned int tok)
    1369                 :             : {
    1370                 :           0 :   if (lvalue)
    1371                 :             :     {
    1372                 :         498 :       return getContent (component, sym, tok);
    1373                 :             :     }
    1374                 :             :   else
    1375                 :             :     {
    1376                 :             :       return component;
    1377                 :             :     }
    1378                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    1379                 :             :   __builtin_unreachable ();
    1380                 :             : }
    1381                 :             : 
    1382                 :             : 
    1383                 :             : /*
    1384                 :             :    SetVarComponentInitialized -
    1385                 :             : */
    1386                 :             : 
    1387                 :         366 : static void SetVarComponentInitialized (unsigned int sym, unsigned int tok)
    1388                 :             : {
    1389                 :         366 :   bool lvalue;
    1390                 :         366 :   unsigned int i;
    1391                 :         366 :   unsigned int n;
    1392                 :         366 :   unsigned int fsym;
    1393                 :         366 :   unsigned int vsym;
    1394                 :         366 :   Lists_List lst;
    1395                 :             : 
    1396                 :         366 :   vsym = ComponentFindVar (sym, &lvalue, tok);
    1397                 :         366 :   vsym = deRefComponent (vsym, lvalue, sym, tok);
    1398                 :         366 :   if (vsym != SymbolTable_NulSym)
    1399                 :             :     {
    1400                 :         354 :       if (Debugging)
    1401                 :             :         {
    1402                 :             :           M2Printf_printf0 ((const char *) "*************** vsym is: ", 25);
    1403                 :             :           M2GCCDeclare_PrintSym (vsym);
    1404                 :             :         }
    1405                 :             :       /* Build list accessing the field.  */
    1406                 :         354 :       lst = ComponentCreateFieldList (sym);
    1407                 :         354 :       if (Debugging)
    1408                 :             :         {
    1409                 :             :           M2Printf_printf2 ((const char *) "sym = %d, vsym = %d, fields:", 28, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &vsym, (sizeof (vsym)-1));
    1410                 :             :         }
    1411                 :             :       /* Now mark this field in the record variable as initialized.  */
    1412                 :         354 :       if (SymbolTable_PutVarFieldInitialized (vsym, SymbolTable_RightValue, lst))
    1413                 :             :         {
    1414                 :             :           /* avoid dangling else.  */
    1415                 :             :           if (Debugging)
    1416                 :             :             {
    1417                 :             :               i = 1;
    1418                 :             :               n = Lists_NoOfItemsInList (lst);
    1419                 :             :               while (i <= n)
    1420                 :             :                 {
    1421                 :             :                   fsym = static_cast<unsigned int> (Lists_GetItemFromList (lst, i));
    1422                 :             :                   M2Printf_printf1 ((const char *) " %d", 3, (const unsigned char *) &fsym, (sizeof (fsym)-1));
    1423                 :             :                   i += 1;
    1424                 :             :                 }
    1425                 :             :               M2Printf_printf0 ((const char *) " is initialized\\n", 17);
    1426                 :             :             }
    1427                 :             :         }
    1428                 :         354 :       else if (Debugging)
    1429                 :             :         {
    1430                 :             :           /* avoid dangling else.  */
    1431                 :             :           M2Printf_printf0 ((const char *) " vsym is not a var\\n", 20);
    1432                 :             :         }
    1433                 :         354 :       Lists_KillList (&lst);
    1434                 :             :     }
    1435                 :         366 : }
    1436                 :             : 
    1437                 :             : 
    1438                 :             : /*
    1439                 :             :    GetVarComponentInitialized -
    1440                 :             : */
    1441                 :             : 
    1442                 :         264 : static bool GetVarComponentInitialized (unsigned int sym, unsigned int tok)
    1443                 :             : {
    1444                 :         264 :   bool lvalue;
    1445                 :         264 :   bool init;
    1446                 :         264 :   unsigned int component;
    1447                 :         264 :   unsigned int vsym;
    1448                 :         264 :   Lists_List lst;
    1449                 :             : 
    1450                 :         264 :   component = ComponentFindVar (sym, &lvalue, tok);
    1451                 :         264 :   if ((Lists_IsItemInList (ignoreList, component)) || (IsExempt (component)))
    1452                 :             :     {
    1453                 :          18 :       return true;
    1454                 :             :     }
    1455                 :             :   else
    1456                 :             :     {
    1457                 :         246 :       init = false;
    1458                 :         246 :       vsym = deRefComponent (component, lvalue, sym, tok);
    1459                 :         246 :       if (vsym != SymbolTable_NulSym)
    1460                 :             :         {
    1461                 :             :           /* avoid gcc warning by using compound statement even if not strictly necessary.  */
    1462                 :         204 :           if (IsExempt (vsym))
    1463                 :             :             {
    1464                 :             :               init = true;
    1465                 :             :             }
    1466                 :             :           else
    1467                 :             :             {
    1468                 :             :               /* Create list representing how the field is accessed.  */
    1469                 :         204 :               lst = ComponentCreateFieldList (sym);
    1470                 :             :               /* Now obtain the mark indicating whether this field was initialized.  */
    1471                 :         204 :               init = SymbolTable_GetVarFieldInitialized (vsym, SymbolTable_RightValue, lst);
    1472                 :         204 :               Lists_KillList (&lst);
    1473                 :             :             }
    1474                 :             :         }
    1475                 :         246 :       return init;
    1476                 :             :     }
    1477                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    1478                 :             :   __builtin_unreachable ();
    1479                 :             : }
    1480                 :             : 
    1481                 :             : 
    1482                 :             : /*
    1483                 :             :    Trace -
    1484                 :             : */
    1485                 :             : 
    1486                 :        6691 : static void Trace (const char *message_, unsigned int _message_high, unsigned int sym)
    1487                 :             : {
    1488                 :        6691 :   char message[_message_high+1];
    1489                 :             : 
    1490                 :             :   /* make a local copy of each unbounded array.  */
    1491                 :        6691 :   memcpy (message, message_, _message_high+1);
    1492                 :             : 
    1493                 :        6691 :   if (Debugging)
    1494                 :             :     {
    1495                 :             :       M2Printf_printf1 ((const char *) message, _message_high, (const unsigned char *) &sym, (sizeof (sym)-1));
    1496                 :             :       M2Printf_printf0 ((const char *) "\\n", 2);
    1497                 :             :     }
    1498                 :        3196 : }
    1499                 :             : 
    1500                 :             : 
    1501                 :             : /*
    1502                 :             :    SetVarInitialized - if the variable has a left mode and can be dereferenced
    1503                 :             :                        then set the left and right initialization state.
    1504                 :             : */
    1505                 :             : 
    1506                 :        3615 : static void SetVarInitialized (unsigned int sym, bool canDereference, unsigned int tok)
    1507                 :             : {
    1508                 :        3615 :   if (SymbolTable_IsVar (sym))
    1509                 :             :     {
    1510                 :        3495 :       Lists_RemoveItemFromList (ignoreList, sym);
    1511                 :        3495 :       if (SymbolTable_IsComponent (sym))
    1512                 :             :         {
    1513                 :         366 :           Trace ((const char *) "SetVarInitialized sym %d is a component and calling SetVarComponentInitialized", 78, sym);
    1514                 :         366 :           SetVarComponentInitialized (sym, tok);
    1515                 :             :         }
    1516                 :        3129 :       else if (((SymbolTable_GetMode (sym)) == SymbolTable_LeftValue) && canDereference)
    1517                 :             :         {
    1518                 :             :           /* avoid dangling else.  */
    1519                 :         234 :           Trace ((const char *) "SetVarInitialized sym %d is LeftValue and canDeference and calling PutVarInitialized LeftValue and RightValue", 109, sym);
    1520                 :         234 :           SymbolTable_PutVarInitialized (sym, SymbolTable_LeftValue);
    1521                 :         234 :           SymbolTable_PutVarInitialized (sym, SymbolTable_RightValue);
    1522                 :             :         }
    1523                 :             :       else
    1524                 :             :         {
    1525                 :             :           /* avoid dangling else.  */
    1526                 :        2895 :           Trace ((const char *) "SetVarInitialized sym %d calling PutVarInitialized with its mode", 64, sym);
    1527                 :        2895 :           SymbolTable_PutVarInitialized (sym, SymbolTable_GetMode (sym));
    1528                 :             :         }
    1529                 :             :       if (Debugging)
    1530                 :             :         {
    1531                 :             :           M2GCCDeclare_PrintSym (sym);
    1532                 :             :         }
    1533                 :             :     }
    1534                 :        3615 : }
    1535                 :             : 
    1536                 :             : 
    1537                 :             : /*
    1538                 :             :    doGetVarInitialized -
    1539                 :             : */
    1540                 :             : 
    1541                 :        1990 : static bool doGetVarInitialized (unsigned int sym, unsigned int tok)
    1542                 :             : {
    1543                 :        1990 :   if (SymbolTable_IsVar (sym))
    1544                 :             :     {
    1545                 :         258 :       if (SymbolTable_IsUnbounded (SymbolTable_GetSType (sym)))
    1546                 :             :         {
    1547                 :             :           return true;
    1548                 :             :         }
    1549                 :         258 :       else if (SymbolTable_IsComponent (sym))
    1550                 :             :         {
    1551                 :             :           /* avoid dangling else.  */
    1552                 :           0 :           return GetVarComponentInitialized (sym, tok);
    1553                 :             :         }
    1554                 :         258 :       return SymbolTable_VarCheckReadInit (sym, SymbolTable_GetMode (sym));
    1555                 :             :     }
    1556                 :        1732 :   return (SymbolTable_IsConst (sym)) && (SymbolTable_IsConstString (sym));
    1557                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    1558                 :             :   __builtin_unreachable ();
    1559                 :             : }
    1560                 :             : 
    1561                 :             : 
    1562                 :             : /*
    1563                 :             :    GetVarInitialized -
    1564                 :             : */
    1565                 :             : 
    1566                 :        1990 : static bool GetVarInitialized (unsigned int sym, unsigned int tok)
    1567                 :             : {
    1568                 :        1990 :   bool init;
    1569                 :             : 
    1570                 :           0 :   init = doGetVarInitialized (sym, tok);
    1571                 :        1990 :   if (Debugging)
    1572                 :             :     {
    1573                 :             :       /* avoid gcc warning by using compound statement even if not strictly necessary.  */
    1574                 :             :       if (init)
    1575                 :             :         {
    1576                 :             :           Trace ((const char *) "GetVarInitialized (sym = %d) returning TRUE", 43, sym);
    1577                 :             :         }
    1578                 :             :       else
    1579                 :             :         {
    1580                 :             :           Trace ((const char *) "GetVarInitialized (sym = %d) returning FALSE", 44, sym);
    1581                 :             :         }
    1582                 :             :     }
    1583                 :        1990 :   return init;
    1584                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    1585                 :             :   __builtin_unreachable ();
    1586                 :             : }
    1587                 :             : 
    1588                 :             : 
    1589                 :             : /*
    1590                 :             :    IsExempt - returns TRUE if sym is a global variable or a parameter or
    1591                 :             :               a variable with a variant record type.
    1592                 :             : */
    1593                 :             : 
    1594                 :        3646 : static bool IsExempt (unsigned int sym)
    1595                 :             : {
    1596                 :             :   /* (IsVarAParam (sym) AND (GetMode (sym) = LeftValue)) OR  */
    1597                 :        3646 :   return ((sym != SymbolTable_NulSym) && (SymbolTable_IsVar (sym))) && (((((((IsGlobalVar (sym)) || (ContainsVariant (sym))) || (SymbolTable_IsArray (SymbolTable_GetSType (sym)))) || (SymbolTable_IsSet (SymbolTable_GetSType (sym)))) || (SymbolTable_IsUnbounded (SymbolTable_GetSType (sym)))) || (SymbolTable_IsVarArrayRef (sym))) || (Lists_IsItemInList (ignoreList, sym)));
    1598                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    1599                 :             :   __builtin_unreachable ();
    1600                 :             : }
    1601                 :             : 
    1602                 :             : 
    1603                 :             : /*
    1604                 :             :    CheckBinary -
    1605                 :             : */
    1606                 :             : 
    1607                 :           6 : static void CheckBinary (unsigned int op1tok, unsigned int op1, unsigned int op2tok, unsigned int op2, unsigned int op3tok, unsigned int op3, bool warning, unsigned int i)
    1608                 :             : {
    1609                 :           6 :   CheckDeferredRecordAccess (op2tok, op2, false, warning, i);
    1610                 :           6 :   CheckDeferredRecordAccess (op3tok, op3, false, warning, i);
    1611                 :           6 :   SetVarInitialized (op1, false, op1tok);
    1612                 :           6 : }
    1613                 :             : 
    1614                 :             : 
    1615                 :             : /*
    1616                 :             :    CheckUnary -
    1617                 :             : */
    1618                 :             : 
    1619                 :           6 : static void CheckUnary (unsigned int lhstok, unsigned int lhs, unsigned int rhstok, unsigned int rhs, bool warning, unsigned int i)
    1620                 :             : {
    1621                 :           6 :   CheckDeferredRecordAccess (rhstok, rhs, false, warning, i);
    1622                 :           6 :   SetVarInitialized (lhs, false, lhstok);
    1623                 :           6 : }
    1624                 :             : 
    1625                 :             : 
    1626                 :             : /*
    1627                 :             :    CheckXIndr -
    1628                 :             : */
    1629                 :             : 
    1630                 :          30 : static void CheckXIndr (unsigned int lhstok, unsigned int lhs, unsigned int type, unsigned int rhstok, unsigned int rhs, bool warning, unsigned int i)
    1631                 :             : {
    1632                 :          30 :   Lists_List lst;
    1633                 :          30 :   unsigned int content;
    1634                 :             : 
    1635                 :          30 :   CheckDeferredRecordAccess (rhstok, rhs, false, warning, i);
    1636                 :          30 :   CheckDeferredRecordAccess (lhstok, lhs, false, warning, i);
    1637                 :             :   /* Now see if we know what lhs is pointing to and set fields if necessary.  */
    1638                 :          30 :   content = getContent (getLAlias (lhs), lhs, lhstok);
    1639                 :          30 :   if (((content != SymbolTable_NulSym) && (content != lhs)) && ((SymbolTable_GetSType (content)) == type))
    1640                 :             :     {
    1641                 :          18 :       if (SymbolTable_IsReallyPointer (rhs))
    1642                 :             :         {
    1643                 :           0 :           SetupLAlias (content, rhs);
    1644                 :             :         }
    1645                 :          18 :       if (SymbolTable_IsRecord (type))
    1646                 :             :         {
    1647                 :             :           /* Set all fields of content as initialized.  */
    1648                 :          18 :           SetVarInitialized (content, false, lhstok);
    1649                 :             :         }
    1650                 :             :       else
    1651                 :             :         {
    1652                 :             :           /* Set only the field assigned in vsym as initialized.  */
    1653                 :           0 :           lst = ComponentCreateFieldList (rhs);
    1654                 :           0 :           if (SymbolTable_PutVarFieldInitialized (content, SymbolTable_RightValue, lst))
    1655                 :             :             {}  /* empty.  */
    1656                 :           0 :           Lists_KillList (&lst);
    1657                 :             :         }
    1658                 :             :     }
    1659                 :          30 : }
    1660                 :             : 
    1661                 :             : 
    1662                 :             : /*
    1663                 :             :    CheckIndrX -
    1664                 :             : */
    1665                 :             : 
    1666                 :         108 : static void CheckIndrX (unsigned int lhstok, unsigned int lhs, unsigned int rhstok, unsigned int rhs, bool warning, unsigned int i)
    1667                 :             : {
    1668                 :         108 :   unsigned int content;
    1669                 :             : 
    1670                 :         108 :   CheckDeferredRecordAccess (rhstok, rhs, false, warning, i);
    1671                 :         108 :   content = getContent (getLAlias (rhs), rhs, rhstok);
    1672                 :         108 :   if (content == SymbolTable_NulSym)
    1673                 :             :     {
    1674                 :          42 :       Lists_IncludeItemIntoList (ignoreList, lhs);
    1675                 :             :     }
    1676                 :             :   else
    1677                 :             :     {
    1678                 :          66 :       CheckDeferredRecordAccess (rhstok, content, true, warning, i);
    1679                 :          66 :       SetVarInitialized (lhs, SymbolTable_VarCheckReadInit (content, SymbolTable_RightValue), lhstok);
    1680                 :          66 :       if (SymbolTable_IsReallyPointer (content))
    1681                 :             :         {
    1682                 :          66 :           SetupLAlias (lhs, content);
    1683                 :             :         }
    1684                 :             :     }
    1685                 :         108 : }
    1686                 :             : 
    1687                 :             : 
    1688                 :             : /*
    1689                 :             :    CheckRecordField -
    1690                 :             : */
    1691                 :             : 
    1692                 :         774 : static void CheckRecordField (unsigned int op1)
    1693                 :             : {
    1694                 :           0 :   SymbolTable_PutVarInitialized (op1, SymbolTable_LeftValue);
    1695                 :         774 : }
    1696                 :             : 
    1697                 :             : 
    1698                 :             : /*
    1699                 :             :    CheckLastForIterator -
    1700                 :             : */
    1701                 :             : 
    1702                 :           0 : static void CheckLastForIterator (unsigned int op1tok, unsigned int op1, unsigned int op2tok, unsigned int op2, bool warning, unsigned int i)
    1703                 :             : {
    1704                 :           0 :   SetVarInitialized (op1, false, op1tok);
    1705                 :           0 :   M2Debug_Assert (SymbolTable_IsTuple (op2));
    1706                 :           0 :   CheckDeferredRecordAccess (op2tok, SymbolTable_GetNth (op2, 1), false, warning, i);
    1707                 :           0 :   CheckDeferredRecordAccess (op2tok, SymbolTable_GetNth (op2, 2), false, warning, i);
    1708                 :           0 : }
    1709                 :             : 
    1710                 :             : 
    1711                 :             : /*
    1712                 :             :    CheckBecomes -
    1713                 :             : */
    1714                 :             : 
    1715                 :         953 : static void CheckBecomes (unsigned int destok, unsigned int des, unsigned int exprtok, unsigned int expr, bool warning, unsigned int i)
    1716                 :             : {
    1717                 :         953 :   bool lvalue;
    1718                 :         953 :   Lists_List lst;
    1719                 :         953 :   unsigned int vsym;
    1720                 :             : 
    1721                 :         953 :   CheckDeferredRecordAccess (exprtok, expr, false, warning, i);
    1722                 :         953 :   SetupLAlias (des, expr);
    1723                 :         953 :   SetVarInitialized (des, false, destok);
    1724                 :             :   /* Now see if we know what lhs is pointing to and set fields if necessary.  */
    1725                 :         953 :   if (SymbolTable_IsComponent (des))
    1726                 :             :     {
    1727                 :         342 :       vsym = ComponentFindVar (des, &lvalue, destok);
    1728                 :         342 :       vsym = deRefComponent (vsym, lvalue, des, destok);
    1729                 :         342 :       if (vsym != SymbolTable_NulSym)
    1730                 :             :         {
    1731                 :             :           /* Set only the field assigned in vsym as initialized.  */
    1732                 :         330 :           lst = ComponentCreateFieldList (des);
    1733                 :         330 :           if (SymbolTable_PutVarFieldInitialized (vsym, SymbolTable_RightValue, lst))
    1734                 :             :             {}  /* empty.  */
    1735                 :         330 :           Lists_KillList (&lst);
    1736                 :             :         }
    1737                 :             :     }
    1738                 :         953 : }
    1739                 :             : 
    1740                 :             : 
    1741                 :             : /*
    1742                 :             :    CheckComparison -
    1743                 :             : */
    1744                 :             : 
    1745                 :         378 : static void CheckComparison (unsigned int op1tok, unsigned int op1, unsigned int op2tok, unsigned int op2, bool warning, unsigned int i)
    1746                 :             : {
    1747                 :         378 :   CheckDeferredRecordAccess (op1tok, op1, false, warning, i);
    1748                 :         378 :   CheckDeferredRecordAccess (op2tok, op2, false, warning, i);
    1749                 :         378 : }
    1750                 :             : 
    1751                 :             : 
    1752                 :             : /*
    1753                 :             :    CheckAddr -
    1754                 :             : */
    1755                 :             : 
    1756                 :        1990 : static void CheckAddr (unsigned int ptrtok, unsigned int ptr, unsigned int contenttok, unsigned int content)
    1757                 :             : {
    1758                 :        1990 :   SetVarInitialized (ptr, GetVarInitialized (content, contenttok), ptrtok);
    1759                 :        3980 :   SetupIndr (ptr, content);
    1760                 :        1990 : }
    1761                 :             : 
    1762                 :             : 
    1763                 :             : /*
    1764                 :             :    DefaultTokPos -
    1765                 :             : */
    1766                 :             : 
    1767                 :       45513 : static unsigned int DefaultTokPos (unsigned int preferredPos, unsigned int defaultPos)
    1768                 :             : {
    1769                 :           7 :   if (preferredPos == M2LexBuf_UnknownTokenNo)
    1770                 :             :     {
    1771                 :       39751 :       return defaultPos;
    1772                 :             :     }
    1773                 :             :   return preferredPos;
    1774                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    1775                 :             :   __builtin_unreachable ();
    1776                 :             : }
    1777                 :             : 
    1778                 :             : 
    1779                 :             : /*
    1780                 :             :    stop -
    1781                 :             : */
    1782                 :             : 
    1783                 :           0 : static void stop (void)
    1784                 :             : {
    1785                 :           0 : }
    1786                 :             : 
    1787                 :             : 
    1788                 :             : /*
    1789                 :             :    CheckReadBeforeInitQuad -
    1790                 :             : */
    1791                 :             : 
    1792                 :       15164 : static bool CheckReadBeforeInitQuad (unsigned int procSym, unsigned int quad, bool warning, unsigned int i)
    1793                 :             : {
    1794                 :       15164 :   M2Quads_QuadOperator op;
    1795                 :       15164 :   unsigned int op1;
    1796                 :       15164 :   unsigned int op2;
    1797                 :       15164 :   unsigned int op3;
    1798                 :       15164 :   unsigned int op1tok;
    1799                 :       15164 :   unsigned int op2tok;
    1800                 :       15164 :   unsigned int op3tok;
    1801                 :       15164 :   unsigned int qtok;
    1802                 :       15164 :   bool constExpr;
    1803                 :       15164 :   bool overflowChecking;
    1804                 :             : 
    1805                 :       15164 :   if (quad == 3140)
    1806                 :             :     {
    1807                 :       15164 :       stop ();
    1808                 :             :     }
    1809                 :       15164 :   if (Debugging)
    1810                 :             :     {
    1811                 :             :       M2Printf_printf1 ((const char *) "CheckReadBeforeInitQuad (quad %d)\\n", 35, (const unsigned char *) &quad, (sizeof (quad)-1));
    1812                 :             :       DumpAliases ();
    1813                 :             :       SymbolTable_ForeachLocalSymDo (procSym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) M2GCCDeclare_PrintSym});
    1814                 :             :       M2Printf_printf0 ((const char *) "***********************************\\n", 37);
    1815                 :             :     }
    1816                 :       15164 :   M2Quads_GetQuadOtok (quad, &qtok, &op, &op1, &op2, &op3, &overflowChecking, &constExpr, &op1tok, &op2tok, &op3tok);
    1817                 :       15164 :   op1tok = DefaultTokPos (op1tok, qtok);
    1818                 :       15164 :   op2tok = DefaultTokPos (op2tok, qtok);
    1819                 :       15164 :   op3tok = DefaultTokPos (op3tok, qtok);
    1820                 :       15164 :   switch (op)
    1821                 :             :     {
    1822                 :         378 :       case M2Quads_IfInOp:
    1823                 :         378 :       case M2Quads_IfNotInOp:
    1824                 :         378 :       case M2Quads_IfEquOp:
    1825                 :         378 :       case M2Quads_IfNotEquOp:
    1826                 :         378 :       case M2Quads_IfLessOp:
    1827                 :         378 :       case M2Quads_IfLessEquOp:
    1828                 :         378 :       case M2Quads_IfGreOp:
    1829                 :         378 :       case M2Quads_IfGreEquOp:
    1830                 :             :         /* Jumps, calls and branches.  */
    1831                 :         378 :         CheckComparison (op1tok, op1, op2tok, op2, warning, i);
    1832                 :         378 :         break;
    1833                 :             : 
    1834                 :           0 :       case M2Quads_LastForIteratorOp:
    1835                 :           0 :         CheckLastForIterator (op1tok, op1, op2tok, op2, warning, i);
    1836                 :           0 :         M2Debug_Assert (SymbolTable_IsConst (op3));
    1837                 :           0 :         break;
    1838                 :             : 
    1839                 :             :       case M2Quads_TryOp:
    1840                 :             :       case M2Quads_ReturnOp:
    1841                 :             :       case M2Quads_CallOp:
    1842                 :             :       case M2Quads_KillLocalVarOp:
    1843                 :             :       case M2Quads_RetryOp:
    1844                 :             :       case M2Quads_GotoOp:
    1845                 :             :         return true;
    1846                 :           0 :         break;
    1847                 :             : 
    1848                 :           0 :       case M2Quads_InclOp:
    1849                 :           0 :       case M2Quads_ExclOp:
    1850                 :             :         /* Variable references.  */
    1851                 :           0 :         CheckDeferredRecordAccess (op1tok, op1, false, warning, i);
    1852                 :           0 :         CheckDeferredRecordAccess (op1tok, op1, true, warning, i);
    1853                 :           0 :         CheckDeferredRecordAccess (op3tok, op3, false, warning, i);
    1854                 :           0 :         break;
    1855                 :             : 
    1856                 :           6 :       case M2Quads_NegateOp:
    1857                 :           6 :         CheckUnary (op1tok, op1, op3tok, op3, warning, i);
    1858                 :           6 :         break;
    1859                 :             : 
    1860                 :         953 :       case M2Quads_BecomesOp:
    1861                 :         953 :         CheckBecomes (op1tok, op1, op3tok, op3, warning, i);
    1862                 :         953 :         break;
    1863                 :             : 
    1864                 :         162 :       case M2Quads_UnboundedOp:
    1865                 :         162 :       case M2Quads_FunctValueOp:
    1866                 :         162 :       case M2Quads_StandardFunctionOp:
    1867                 :         162 :       case M2Quads_HighOp:
    1868                 :         162 :       case M2Quads_SizeOp:
    1869                 :         162 :         SetVarInitialized (op1, false, op1tok);
    1870                 :         162 :         break;
    1871                 :             : 
    1872                 :        1990 :       case M2Quads_AddrOp:
    1873                 :        1990 :         CheckAddr (op1tok, op1, op3tok, op3);
    1874                 :        1990 :         break;
    1875                 :             : 
    1876                 :           6 :       case M2Quads_ReturnValueOp:
    1877                 :           6 :         SetVarInitialized (op1, false, op1tok);
    1878                 :           6 :         break;
    1879                 :             : 
    1880                 :        1087 :       case M2Quads_NewLocalVarOp:
    1881                 :        1087 :         SetParameterVariablesInitialized (op3);
    1882                 :        1087 :         break;
    1883                 :             : 
    1884                 :        3465 :       case M2Quads_ParamOp:
    1885                 :        3465 :         CheckDeferredRecordAccess (op2tok, op2, false, warning, i);
    1886                 :        3465 :         CheckDeferredRecordAccess (op3tok, op3, false, warning, i);
    1887                 :        3465 :         if (((op1 > 0) && (op1 <= (SymbolTable_NoOfParamAny (op2)))) && (SymbolTable_IsVarParamAny (op2, op1)))
    1888                 :             :           {
    1889                 :         156 :             SetVarInitialized (op3, true, op3tok);
    1890                 :             :           }
    1891                 :             :         break;
    1892                 :             : 
    1893                 :          12 :       case M2Quads_ArrayOp:
    1894                 :          12 :         CheckDeferredRecordAccess (op3tok, op3, false, warning, i);
    1895                 :          12 :         SetVarInitialized (op1, true, op1tok);
    1896                 :          12 :         break;
    1897                 :             : 
    1898                 :         774 :       case M2Quads_RecordFieldOp:
    1899                 :         774 :         CheckRecordField (op1);
    1900                 :         774 :         break;
    1901                 :             : 
    1902                 :           6 :       case M2Quads_LogicalShiftOp:
    1903                 :           6 :       case M2Quads_LogicalRotateOp:
    1904                 :           6 :       case M2Quads_LogicalOrOp:
    1905                 :           6 :       case M2Quads_LogicalAndOp:
    1906                 :           6 :       case M2Quads_LogicalXorOp:
    1907                 :           6 :       case M2Quads_LogicalDiffOp:
    1908                 :           6 :       case M2Quads_CoerceOp:
    1909                 :           6 :       case M2Quads_ConvertOp:
    1910                 :           6 :       case M2Quads_CastOp:
    1911                 :           6 :       case M2Quads_AddOp:
    1912                 :           6 :       case M2Quads_ArithAddOp:
    1913                 :           6 :       case M2Quads_SubOp:
    1914                 :           6 :       case M2Quads_MultOp:
    1915                 :           6 :       case M2Quads_DivM2Op:
    1916                 :           6 :       case M2Quads_ModM2Op:
    1917                 :           6 :       case M2Quads_ModFloorOp:
    1918                 :           6 :       case M2Quads_DivCeilOp:
    1919                 :           6 :       case M2Quads_ModCeilOp:
    1920                 :           6 :       case M2Quads_DivFloorOp:
    1921                 :           6 :       case M2Quads_ModTruncOp:
    1922                 :           6 :       case M2Quads_DivTruncOp:
    1923                 :           6 :         CheckBinary (op1tok, op1, op2tok, op2, op3tok, op3, warning, i);
    1924                 :           6 :         break;
    1925                 :             : 
    1926                 :          30 :       case M2Quads_XIndrOp:
    1927                 :          30 :         CheckXIndr (op1tok, op1, op2, op3tok, op3, warning, i);
    1928                 :          30 :         break;
    1929                 :             : 
    1930                 :         108 :       case M2Quads_IndrXOp:
    1931                 :         108 :         CheckIndrX (op1tok, op1, op3tok, op3, warning, i);
    1932                 :         108 :         break;
    1933                 :             : 
    1934                 :           0 :       case M2Quads_SaveExceptionOp:
    1935                 :           0 :         SetVarInitialized (op1, false, op1tok);
    1936                 :           0 :         break;
    1937                 :             : 
    1938                 :           0 :       case M2Quads_RestoreExceptionOp:
    1939                 :           0 :         CheckDeferredRecordAccess (op1tok, op1, false, warning, i);
    1940                 :           0 :         break;
    1941                 :             : 
    1942                 :           0 :       case M2Quads_SubrangeLowOp:
    1943                 :           0 :       case M2Quads_SubrangeHighOp:
    1944                 :           0 :         M2Error_InternalError ((const char *) "quadruples should have been resolved", 36);
    1945                 :             :         break;
    1946                 :             : 
    1947                 :             :       case M2Quads_ElementSizeOp:
    1948                 :             :       case M2Quads_BuiltinConstOp:
    1949                 :             :       case M2Quads_BuiltinTypeInfoOp:
    1950                 :             :       case M2Quads_StringConvertCnulOp:
    1951                 :             :       case M2Quads_StringConvertM2nulOp:
    1952                 :             :       case M2Quads_StringLengthOp:
    1953                 :             :       case M2Quads_ProcedureScopeOp:
    1954                 :             :       case M2Quads_InitEndOp:
    1955                 :             :       case M2Quads_InitStartOp:
    1956                 :             :       case M2Quads_FinallyStartOp:
    1957                 :             :       case M2Quads_FinallyEndOp:
    1958                 :             :       case M2Quads_CatchBeginOp:
    1959                 :             :       case M2Quads_CatchEndOp:
    1960                 :             :       case M2Quads_ThrowOp:
    1961                 :             :       case M2Quads_StartDefFileOp:
    1962                 :             :       case M2Quads_StartModFileOp:
    1963                 :             :       case M2Quads_EndFileOp:
    1964                 :             :       case M2Quads_CodeOnOp:
    1965                 :             :       case M2Quads_CodeOffOp:
    1966                 :             :       case M2Quads_ProfileOnOp:
    1967                 :             :       case M2Quads_ProfileOffOp:
    1968                 :             :       case M2Quads_OptimizeOnOp:
    1969                 :             :       case M2Quads_OptimizeOffOp:
    1970                 :             :       case M2Quads_InlineOp:
    1971                 :             :       case M2Quads_LineNumberOp:
    1972                 :             :       case M2Quads_StatementNoteOp:
    1973                 :             :       case M2Quads_SavePriorityOp:
    1974                 :             :       case M2Quads_RestorePriorityOp:
    1975                 :             :       case M2Quads_RangeCheckOp:
    1976                 :             :       case M2Quads_ModuleScopeOp:
    1977                 :             :       case M2Quads_ErrorOp:
    1978                 :             :       case M2Quads_DummyOp:
    1979                 :             :       case M2Quads_OptParamOp:
    1980                 :             :       case M2Quads_InitAddressOp:
    1981                 :             :         break;
    1982                 :             : 
    1983                 :             : 
    1984                 :           0 :       default:
    1985                 :           0 :         CaseException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/M2SymInit.def", 20, 1);
    1986                 :           0 :         __builtin_unreachable ();
    1987                 :             :     }
    1988                 :             :   return false;  /* Likewise assigning op1 (const) with a type.  */
    1989                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    1990                 :             :   __builtin_unreachable ();
    1991                 :             : }
    1992                 :             : 
    1993                 :             : 
    1994                 :             : /*
    1995                 :             :    SetParameterVariablesInitialized - sets all shadow variables for parameters as
    1996                 :             :                                       initialized.
    1997                 :             : */
    1998                 :             : 
    1999                 :        1087 : static void SetParameterVariablesInitialized (unsigned int procSym)
    2000                 :             : {
    2001                 :        1087 :   SymbolTable_ForeachLocalSymDo (procSym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) SetVarUninitialized});
    2002                 :        1087 :   SymbolTable_ForeachParamSymDo (procSym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) SetVarLRInitialized});
    2003                 :        1087 : }
    2004                 :             : 
    2005                 :             : 
    2006                 :             : /*
    2007                 :             :    FilterCheckReadBeforeInitQuad -
    2008                 :             : */
    2009                 :             : 
    2010                 :       25283 : static bool FilterCheckReadBeforeInitQuad (unsigned int procSym, unsigned int start, bool warning, unsigned int i)
    2011                 :             : {
    2012                 :       25283 :   M2Quads_QuadOperator Op;
    2013                 :       25283 :   unsigned int Op1;
    2014                 :       25283 :   unsigned int Op2;
    2015                 :       25283 :   unsigned int Op3;
    2016                 :             : 
    2017                 :       25283 :   M2Quads_GetQuad (start, &Op, &Op1, &Op2, &Op3);
    2018                 :       25283 :   if ((Op != M2Quads_RangeCheckOp) && (Op != M2Quads_StatementNoteOp))
    2019                 :             :     {
    2020                 :       15164 :       return CheckReadBeforeInitQuad (procSym, start, warning, i);
    2021                 :             :     }
    2022                 :             :   return false;
    2023                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    2024                 :             :   __builtin_unreachable ();
    2025                 :             : }
    2026                 :             : 
    2027                 :             : 
    2028                 :             : /*
    2029                 :             :    CheckReadBeforeInitFirstBasicBlock -
    2030                 :             : */
    2031                 :             : 
    2032                 :        5979 : static void CheckReadBeforeInitFirstBasicBlock (unsigned int procSym, unsigned int start, unsigned int end, bool warning, unsigned int i)
    2033                 :             : {
    2034                 :       44587 :   for (;;)
    2035                 :             :   {
    2036                 :       25283 :     if (FilterCheckReadBeforeInitQuad (procSym, start, warning, i))
    2037                 :             :       {}  /* empty.  */
    2038                 :       25283 :     if (start == end)
    2039                 :             :       {
    2040                 :        5979 :         return;
    2041                 :             :       }
    2042                 :             :     else
    2043                 :             :       {
    2044                 :       19304 :         start = M2Quads_GetNextQuad (start);
    2045                 :             :       }
    2046                 :             :   }
    2047                 :             : }
    2048                 :             : 
    2049                 :             : 
    2050                 :             : /*
    2051                 :             :    bbArrayKill -
    2052                 :             : */
    2053                 :             : 
    2054                 :        2840 : static void bbArrayKill (void)
    2055                 :             : {
    2056                 :        2840 :   unsigned int i;
    2057                 :        2840 :   unsigned int h;
    2058                 :        2840 :   M2SymInit_bbEntry bbPtr;
    2059                 :             : 
    2060                 :        2840 :   h = Indexing_HighIndice (bbArray);
    2061                 :        2840 :   i = 1;
    2062                 :       13047 :   while (i <= h)
    2063                 :             :     {
    2064                 :        7367 :       bbPtr = static_cast<M2SymInit_bbEntry> (Indexing_GetIndice (bbArray, i));
    2065                 :        7367 :       bbPtr->next = bbFreeList;
    2066                 :        7367 :       bbFreeList = bbPtr;
    2067                 :        7367 :       i += 1;
    2068                 :             :     }
    2069                 :        2840 :   bbArray = Indexing_KillIndex (bbArray);
    2070                 :        2840 : }
    2071                 :             : 
    2072                 :             : 
    2073                 :             : /*
    2074                 :             :    DumpBBEntry -
    2075                 :             : */
    2076                 :             : 
    2077                 :           0 : static void DumpBBEntry (M2SymInit_bbEntry bbPtr, unsigned int procSym)
    2078                 :             : {
    2079                 :           0 :   M2Printf_printf4 ((const char *) "bb %d: scope %d:  quads: %d .. %d", 33, (const unsigned char *) &bbPtr->indexBB, (sizeof (bbPtr->indexBB)-1), (const unsigned char *) &procSym, (sizeof (procSym)-1), (const unsigned char *) &bbPtr->start, (sizeof (bbPtr->start)-1), (const unsigned char *) &bbPtr->end, (sizeof (bbPtr->end)-1));
    2080                 :           0 :   if (bbPtr->first)
    2081                 :             :     {
    2082                 :           0 :       M2Printf_printf0 ((const char *) " first", 6);
    2083                 :             :     }
    2084                 :           0 :   if (bbPtr->endCall)
    2085                 :             :     {
    2086                 :           0 :       M2Printf_printf0 ((const char *) " endcall", 8);
    2087                 :             :     }
    2088                 :           0 :   if (bbPtr->endGoto)
    2089                 :             :     {
    2090                 :           0 :       M2Printf_printf0 ((const char *) " endgoto", 8);
    2091                 :             :     }
    2092                 :           0 :   if (bbPtr->endCond)
    2093                 :             :     {
    2094                 :           0 :       M2Printf_printf0 ((const char *) " endcond", 8);
    2095                 :             :     }
    2096                 :           0 :   if (bbPtr->topOfLoop)
    2097                 :             :     {
    2098                 :           0 :       M2Printf_printf0 ((const char *) " topofloop", 10);
    2099                 :             :     }
    2100                 :           0 :   if (bbPtr->condBB != 0)
    2101                 :             :     {
    2102                 :           0 :       M2Printf_printf1 ((const char *) " cond %d", 8, (const unsigned char *) &bbPtr->condBB, (sizeof (bbPtr->condBB)-1));
    2103                 :             :     }
    2104                 :           0 :   if (bbPtr->nextBB != 0)
    2105                 :             :     {
    2106                 :           0 :       M2Printf_printf1 ((const char *) " next %d", 8, (const unsigned char *) &bbPtr->nextBB, (sizeof (bbPtr->nextBB)-1));
    2107                 :             :     }
    2108                 :           0 :   M2Printf_printf0 ((const char *) "\\n", 2);
    2109                 :           0 : }
    2110                 :             : 
    2111                 :             : 
    2112                 :             : /*
    2113                 :             :    DumpBBArray -
    2114                 :             : */
    2115                 :             : 
    2116                 :           0 : static void DumpBBArray (unsigned int procSym)
    2117                 :             : {
    2118                 :           0 :   M2SymInit_bbEntry bbPtr;
    2119                 :           0 :   unsigned int i;
    2120                 :           0 :   unsigned int n;
    2121                 :             : 
    2122                 :           0 :   i = 1;
    2123                 :           0 :   n = Indexing_HighIndice (bbArray);
    2124                 :           0 :   while (i <= n)
    2125                 :             :     {
    2126                 :           0 :       bbPtr = static_cast<M2SymInit_bbEntry> (Indexing_GetIndice (bbArray, i));
    2127                 :           0 :       DumpBBEntry (bbPtr, procSym);
    2128                 :           0 :       i += 1;
    2129                 :             :     }
    2130                 :             :   i = 1;
    2131                 :           0 :   while (i <= n)
    2132                 :             :     {
    2133                 :           0 :       bbPtr = static_cast<M2SymInit_bbEntry> (Indexing_GetIndice (bbArray, i));
    2134                 :           0 :       M2Printf_printf4 ((const char *) "bb %d: scope %d:  quads: %d .. %d\\n", 35, (const unsigned char *) &bbPtr->indexBB, (sizeof (bbPtr->indexBB)-1), (const unsigned char *) &procSym, (sizeof (procSym)-1), (const unsigned char *) &bbPtr->start, (sizeof (bbPtr->start)-1), (const unsigned char *) &bbPtr->end, (sizeof (bbPtr->end)-1));
    2135                 :           0 :       M2Quads_DisplayQuadRange (procSym, bbPtr->start, bbPtr->end);
    2136                 :           0 :       i += 1;
    2137                 :             :     }
    2138                 :           0 : }
    2139                 :             : 
    2140                 :             : 
    2141                 :             : /*
    2142                 :             :    DumpBBSequence -
    2143                 :             : */
    2144                 :             : 
    2145                 :           0 : static void DumpBBSequence (Lists_List lst)
    2146                 :             : {
    2147                 :           0 :   unsigned int arrayindex;
    2148                 :           0 :   unsigned int listindex;
    2149                 :           0 :   unsigned int n;
    2150                 :             : 
    2151                 :           0 :   n = Lists_NoOfItemsInList (lst);
    2152                 :           0 :   listindex = 1;
    2153                 :           0 :   M2Printf_printf0 ((const char *) "=============\\n", 15);
    2154                 :           0 :   M2Printf_printf0 ((const char *) " checking sequence:", 19);
    2155                 :           0 :   while (listindex <= n)
    2156                 :             :     {
    2157                 :           0 :       arrayindex = static_cast<unsigned int> (Lists_GetItemFromList (lst, listindex));
    2158                 :           0 :       M2Printf_printf2 ((const char *) " lst[%d] -> %d", 14, (const unsigned char *) &listindex, (sizeof (listindex)-1), (const unsigned char *) &arrayindex, (sizeof (arrayindex)-1));
    2159                 :           0 :       listindex += 1;
    2160                 :             :     }
    2161                 :           0 :   M2Printf_printf0 ((const char *) "\\n", 2);
    2162                 :           0 : }
    2163                 :             : 
    2164                 :             : 
    2165                 :             : /*
    2166                 :             :    trashParam -
    2167                 :             : */
    2168                 :             : 
    2169                 :         120 : static void trashParam (unsigned int trashQuad)
    2170                 :             : {
    2171                 :         120 :   M2Quads_QuadOperator op;
    2172                 :         120 :   unsigned int op1;
    2173                 :         120 :   unsigned int proc;
    2174                 :         120 :   unsigned int param;
    2175                 :         120 :   unsigned int paramValue;
    2176                 :         120 :   unsigned int op1tok;
    2177                 :         120 :   unsigned int op2tok;
    2178                 :         120 :   unsigned int paramtok;
    2179                 :         120 :   unsigned int qtok;
    2180                 :         120 :   bool constExpr;
    2181                 :         120 :   bool overflowChecking;
    2182                 :         120 :   unsigned int heapValue;
    2183                 :         120 :   unsigned int ptrToHeap;
    2184                 :             : 
    2185                 :         120 :   if (trashQuad != 0)
    2186                 :             :     {
    2187                 :         120 :       M2Quads_GetQuadOtok (trashQuad, &qtok, &op, &op1, &proc, &param, &overflowChecking, &constExpr, &op1tok, &op2tok, &paramtok);
    2188                 :         120 :       heapValue = M2Quads_GetQuadTrash (trashQuad);
    2189                 :         120 :       if (Debugging)
    2190                 :             :         {
    2191                 :             :           M2Printf_printf1 ((const char *) "heapValue = %d\\n", 16, (const unsigned char *) &heapValue, (sizeof (heapValue)-1));
    2192                 :             :         }
    2193                 :         120 :       if (heapValue != SymbolTable_NulSym)
    2194                 :             :         {
    2195                 :         120 :           SetVarInitialized (param, false, paramtok);
    2196                 :         120 :           paramValue = getLAlias (param);
    2197                 :         120 :           ptrToHeap = getContent (paramValue, param, paramtok);
    2198                 :         120 :           if (ptrToHeap != SymbolTable_NulSym)
    2199                 :             :             {
    2200                 :             :               /* avoid gcc warning by using compound statement even if not strictly necessary.  */
    2201                 :         120 :               if (IsDeallocate (proc))
    2202                 :             :                 {
    2203                 :          48 :                   SetupLAlias (ptrToHeap, M2Base_Nil);
    2204                 :          48 :                   SetVarInitialized (ptrToHeap, false, paramtok);
    2205                 :             :                 }
    2206                 :             :               else
    2207                 :             :                 {
    2208                 :         144 :                   SetupIndr (ptrToHeap, heapValue);
    2209                 :          72 :                   SetVarInitialized (ptrToHeap, true, paramtok);
    2210                 :             :                 }
    2211                 :             :             }
    2212                 :             :         }
    2213                 :             :     }
    2214                 :         120 :   DumpAliases ();
    2215                 :         120 : }
    2216                 :             : 
    2217                 :             : 
    2218                 :             : /*
    2219                 :             :    SetVarLRInitialized - this sets up an alias between the parameter
    2220                 :             :                          value and the pointer for the case:
    2221                 :             : 
    2222                 :             :                          procedure foo (var shadow: PtrToType) ;
    2223                 :             : 
    2224                 :             :                          which allows shadow to be statically analyzed
    2225                 :             :                          once it is re-assigned.
    2226                 :             : */
    2227                 :             : 
    2228                 :         300 : static void SetVarLRInitialized (unsigned int param)
    2229                 :             : {
    2230                 :         300 :   unsigned int heap;
    2231                 :         300 :   unsigned int shadow;
    2232                 :             : 
    2233                 :         300 :   M2Debug_Assert (SymbolTable_IsParameter (param));
    2234                 :         300 :   shadow = SymbolTable_GetParameterShadowVar (param);
    2235                 :         300 :   if (shadow != SymbolTable_NulSym)
    2236                 :             :     {
    2237                 :         300 :       Lists_IncludeItemIntoList (ignoreList, shadow);
    2238                 :             :     }
    2239                 :         300 :   heap = SymbolTable_GetParameterHeapVar (param);
    2240                 :         300 :   if ((shadow != SymbolTable_NulSym) && (heap != SymbolTable_NulSym))
    2241                 :             :     {
    2242                 :          96 :       SymbolTable_PutVarInitialized (shadow, SymbolTable_GetMode (shadow));
    2243                 :          96 :       SymbolTable_PutVarInitialized (heap, SymbolTable_GetMode (heap));
    2244                 :         192 :       SetupIndr (shadow, heap);
    2245                 :          96 :       Lists_IncludeItemIntoList (ignoreList, heap);
    2246                 :             :     }
    2247                 :         300 : }
    2248                 :             : 
    2249                 :             : 
    2250                 :             : /*
    2251                 :             :    TestBBSequence -
    2252                 :             : */
    2253                 :             : 
    2254                 :        2946 : static void TestBBSequence (unsigned int procSym, Lists_List lst)
    2255                 :             : {
    2256                 :        2946 :   M2SymInit_bbEntry bbPtr;
    2257                 :        2946 :   unsigned int bbi;
    2258                 :        2946 :   unsigned int i;
    2259                 :        2946 :   unsigned int n;
    2260                 :        2946 :   bool warning;
    2261                 :             : 
    2262                 :        2946 :   if (Debugging)  /* Should we issue a warning rather than a note?  */
    2263                 :             :     {
    2264                 :             :       DumpBBSequence (lst);
    2265                 :             :     }
    2266                 :        2946 :   initBlock ();
    2267                 :        2946 :   SymbolTable_ForeachLocalSymDo (procSym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) SetVarUninitialized});
    2268                 :        2946 :   SymbolTable_ForeachParamSymDo (procSym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) SetVarLRInitialized});
    2269                 :        2946 :   n = Lists_NoOfItemsInList (lst);
    2270                 :        2946 :   i = 1;
    2271                 :        2946 :   warning = true;
    2272                 :       11871 :   while (i <= n)
    2273                 :             :     {
    2274                 :        5979 :       bbi = static_cast<unsigned int> (Lists_GetItemFromList (lst, i));
    2275                 :        5979 :       bbPtr = static_cast<M2SymInit_bbEntry> (Indexing_GetIndice (bbArray, bbi));
    2276                 :        5979 :       CheckReadBeforeInitFirstBasicBlock (procSym, bbPtr->start, bbPtr->end, warning, i);
    2277                 :        5979 :       if (bbPtr->endCond)
    2278                 :             :         {
    2279                 :             :           /* Check to see if we are moving into an conditional block in which case
    2280                 :             :             we will issue a note.  */
    2281                 :             :           warning = false;
    2282                 :             :         }
    2283                 :        5601 :       else if (bbPtr->endCall && (bbPtr->trashQuad != 0))
    2284                 :             :         {
    2285                 :             :           /* avoid dangling else.  */
    2286                 :         120 :           trashParam (bbPtr->trashQuad);
    2287                 :             :         }
    2288                 :        5979 :       i += 1;
    2289                 :             :     }
    2290                 :        2946 :   killBlock ();
    2291                 :        2946 : }
    2292                 :             : 
    2293                 :             : 
    2294                 :             : /*
    2295                 :             :    CreateBBPermultations -
    2296                 :             : */
    2297                 :             : 
    2298                 :        7493 : static void CreateBBPermultations (unsigned int procSym, unsigned int i, Lists_List lst)
    2299                 :             : {
    2300                 :        7493 :   Lists_List duplst;
    2301                 :        7493 :   M2SymInit_bbEntry iPtr;
    2302                 :             : 
    2303                 :        7493 :   if (i == 0)
    2304                 :             :     {
    2305                 :        1749 :       TestBBSequence (procSym, lst);
    2306                 :             :     }
    2307                 :             :   else
    2308                 :             :     {
    2309                 :        5744 :       iPtr = static_cast<M2SymInit_bbEntry> (Indexing_GetIndice (bbArray, i));
    2310                 :        5744 :       if (iPtr->topOfLoop)
    2311                 :             :         {
    2312                 :          18 :           TestBBSequence (procSym, lst);
    2313                 :             :         }
    2314                 :             :       else
    2315                 :             :         {
    2316                 :        5726 :           duplst = Lists_DuplicateList (lst);
    2317                 :        5726 :           Lists_IncludeItemIntoList (duplst, i);
    2318                 :        5726 :           if (iPtr->endCall && (iPtr->trashQuad == 0))
    2319                 :             :             {
    2320                 :        1017 :               TestBBSequence (procSym, duplst);
    2321                 :             :             }
    2322                 :        4709 :           else if (iPtr->endGoto)
    2323                 :             :             {
    2324                 :             :               /* avoid dangling else.  */
    2325                 :          13 :               CreateBBPermultations (procSym, iPtr->nextBB, duplst);
    2326                 :             :             }
    2327                 :        4696 :           else if (M2Options_UninitVariableConditionalChecking && iPtr->endCond)
    2328                 :             :             {
    2329                 :             :               /* avoid dangling else.  */
    2330                 :         106 :               CreateBBPermultations (procSym, iPtr->nextBB, duplst);
    2331                 :         106 :               CreateBBPermultations (procSym, iPtr->condBB, duplst);
    2332                 :             :             }
    2333                 :        4590 :           else if (iPtr->endCond)
    2334                 :             :             {
    2335                 :             :               /* avoid dangling else.  */
    2336                 :         162 :               TestBBSequence (procSym, duplst);
    2337                 :             :             }
    2338                 :             :           else
    2339                 :             :             {
    2340                 :             :               /* avoid dangling else.  */
    2341                 :             :               /* Fall through.  */
    2342                 :        4428 :               CreateBBPermultations (procSym, iPtr->nextBB, duplst);
    2343                 :             :             }
    2344                 :        5726 :           Lists_KillList (&duplst);
    2345                 :             :         }
    2346                 :             :     }
    2347                 :        7493 : }
    2348                 :             : 
    2349                 :             : 
    2350                 :             : /*
    2351                 :             :    GetOp3 -
    2352                 :             : */
    2353                 :             : 
    2354                 :         303 : static unsigned int GetOp3 (unsigned int quad)
    2355                 :             : {
    2356                 :         303 :   M2Quads_QuadOperator op;
    2357                 :         303 :   unsigned int op1;
    2358                 :         303 :   unsigned int op2;
    2359                 :         303 :   unsigned int op3;
    2360                 :             : 
    2361                 :         303 :   M2Quads_GetQuad (quad, &op, &op1, &op2, &op3);
    2362                 :         303 :   return op3;
    2363                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    2364                 :             :   __builtin_unreachable ();
    2365                 :             : }
    2366                 :             : 
    2367                 :             : 
    2368                 :             : /*
    2369                 :             :    getBBindex - return the basic block index which starts with quad.
    2370                 :             : */
    2371                 :             : 
    2372                 :        6677 : static unsigned int getBBindex (unsigned int quad)
    2373                 :             : {
    2374                 :        6677 :   M2SymInit_bbEntry iPtr;
    2375                 :        6677 :   unsigned int i;
    2376                 :        6677 :   unsigned int high;
    2377                 :             : 
    2378                 :        6677 :   i = 1;
    2379                 :        6677 :   high = Indexing_HighIndice (bbArray);
    2380                 :       27386 :   while (i <= high)
    2381                 :             :     {
    2382                 :       18862 :       iPtr = static_cast<M2SymInit_bbEntry> (Indexing_GetIndice (bbArray, i));
    2383                 :       18862 :       if (iPtr->start == quad)
    2384                 :             :         {
    2385                 :        4830 :           return iPtr->indexBB;
    2386                 :             :         }
    2387                 :       14032 :       i += 1;
    2388                 :             :     }
    2389                 :             :   return 0;
    2390                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    2391                 :             :   __builtin_unreachable ();
    2392                 :             : }
    2393                 :             : 
    2394                 :             : 
    2395                 :             : /*
    2396                 :             :    GenerateCFG -
    2397                 :             : */
    2398                 :             : 
    2399                 :        2840 : static void GenerateCFG (void)
    2400                 :             : {
    2401                 :        2840 :   M2SymInit_bbEntry iPtr;
    2402                 :        2840 :   unsigned int next;
    2403                 :        2840 :   unsigned int i;
    2404                 :        2840 :   unsigned int high;
    2405                 :             : 
    2406                 :        2840 :   i = 1;
    2407                 :        2840 :   high = Indexing_HighIndice (bbArray);
    2408                 :       13047 :   while (i <= high)
    2409                 :             :     {
    2410                 :        7367 :       iPtr = static_cast<M2SymInit_bbEntry> (Indexing_GetIndice (bbArray, i));
    2411                 :        7367 :       if ((M2Quads_IsKillLocalVar (iPtr->end)) || (M2Quads_IsReturn (iPtr->end)))
    2412                 :             :         {}  /* empty.  */
    2413                 :             :       else
    2414                 :             :         {
    2415                 :             :           /* Nothing to do as we have reached the end of this scope.  */
    2416                 :        6374 :           next = M2Quads_GetNextQuad (iPtr->end);
    2417                 :        6374 :           iPtr->nextQuad = next;
    2418                 :        6374 :           iPtr->nextBB = getBBindex (next);
    2419                 :        6374 :           if (iPtr->endCond)
    2420                 :             :             {
    2421                 :         303 :               iPtr->condQuad = GetOp3 (iPtr->end);
    2422                 :         303 :               iPtr->condBB = getBBindex (iPtr->condQuad);
    2423                 :             :             }
    2424                 :             :         }
    2425                 :        7367 :       i += 1;
    2426                 :             :     }
    2427                 :        2840 : }
    2428                 :             : 
    2429                 :             : 
    2430                 :             : /*
    2431                 :             :    NewEntry -
    2432                 :             : */
    2433                 :             : 
    2434                 :        7367 : static M2SymInit_bbEntry NewEntry (void)
    2435                 :             : {
    2436                 :        7367 :   M2SymInit_bbEntry bbPtr;
    2437                 :             : 
    2438                 :        7367 :   if (bbFreeList == NULL)
    2439                 :             :     {
    2440                 :        1579 :       Storage_ALLOCATE ((void **) &bbPtr, sizeof (M2SymInit__T3));
    2441                 :             :     }
    2442                 :             :   else
    2443                 :             :     {
    2444                 :        5788 :       bbPtr = bbFreeList;
    2445                 :        5788 :       bbFreeList = bbFreeList->next;
    2446                 :             :     }
    2447                 :        7367 :   return bbPtr;
    2448                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    2449                 :             :   __builtin_unreachable ();
    2450                 :             : }
    2451                 :             : 
    2452                 :             : 
    2453                 :             : /*
    2454                 :             :    IsAllocate - return TRUE is sym is ALLOCATE.
    2455                 :             : */
    2456                 :             : 
    2457                 :        1160 : static bool IsAllocate (unsigned int sym)
    2458                 :             : {
    2459                 :        1160 :   return (SymbolTable_IsProcedure (sym)) && ((SymbolTable_GetSymName (sym)) == (NameKey_MakeKey ((const char *) "ALLOCATE", 8)));
    2460                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    2461                 :             :   __builtin_unreachable ();
    2462                 :             : }
    2463                 :             : 
    2464                 :             : 
    2465                 :             : /*
    2466                 :             :    IsDeallocate - return TRUE is sym is DEALLOCATE.
    2467                 :             : */
    2468                 :             : 
    2469                 :        1232 : static bool IsDeallocate (unsigned int sym)
    2470                 :             : {
    2471                 :        1232 :   return (SymbolTable_IsProcedure (sym)) && ((SymbolTable_GetSymName (sym)) == (NameKey_MakeKey ((const char *) "DEALLOCATE", 10)));
    2472                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    2473                 :             :   __builtin_unreachable ();
    2474                 :             : }
    2475                 :             : 
    2476                 :             : 
    2477                 :             : /*
    2478                 :             :    DetectTrash -
    2479                 :             : */
    2480                 :             : 
    2481                 :        7367 : static void DetectTrash (M2SymInit_bbEntry bbPtr)
    2482                 :             : {
    2483                 :        7367 :   unsigned int i;
    2484                 :        7367 :   M2Quads_QuadOperator op;
    2485                 :        7367 :   unsigned int op1;
    2486                 :        7367 :   unsigned int op2;
    2487                 :        7367 :   unsigned int op3;
    2488                 :             : 
    2489                 :        7367 :   if (bbPtr->endCall)
    2490                 :             :     {
    2491                 :        1401 :       i = bbPtr->start;
    2492                 :       32739 :       for (;;)
    2493                 :             :       {
    2494                 :       17070 :         M2Quads_GetQuad (i, &op, &op1, &op2, &op3);
    2495                 :       17070 :         if (((op == M2Quads_ParamOp) && (op1 == 1)) && ((IsAllocate (op2)) || (IsDeallocate (op2))))
    2496                 :             :           {
    2497                 :          72 :             bbPtr->trashQuad = i;
    2498                 :             :           }
    2499                 :       17070 :         if (i == bbPtr->end)
    2500                 :             :           {
    2501                 :        1401 :             return;
    2502                 :             :           }
    2503                 :       15669 :         i = M2Quads_GetNextQuad (i);
    2504                 :             :       }
    2505                 :             :     }
    2506                 :             : }
    2507                 :             : 
    2508                 :             : 
    2509                 :             : /*
    2510                 :             :    AppendEntry -
    2511                 :             : */
    2512                 :             : 
    2513                 :        7367 : static void AppendEntry (M2BasicBlock_BasicBlock bb)
    2514                 :             : {
    2515                 :        7367 :   M2SymInit_bbEntry bbPtr;
    2516                 :        7367 :   unsigned int high;
    2517                 :             : 
    2518                 :        7367 :   high = Indexing_HighIndice (bbArray);
    2519                 :        7367 :   bbPtr = NewEntry ();
    2520                 :        7367 :   bbPtr->start = M2BasicBlock_GetBasicBlockStart (bb);
    2521                 :        7367 :   bbPtr->end = M2BasicBlock_GetBasicBlockEnd (bb);
    2522                 :        7367 :   bbPtr->first = high == 0;
    2523                 :        7367 :   bbPtr->endCall = M2Quads_IsCall (bbPtr->end);
    2524                 :        7367 :   bbPtr->endGoto = M2Quads_IsGoto (bbPtr->end);
    2525                 :        7367 :   bbPtr->endCond = M2Quads_IsConditional (bbPtr->end);
    2526                 :        7367 :   bbPtr->topOfLoop = M2Quads_IsBackReference (bbPtr->start);
    2527                 :        7367 :   bbPtr->trashQuad = 0;
    2528                 :        7367 :   bbPtr->indexBB = high+1;
    2529                 :        7367 :   bbPtr->nextQuad = 0;
    2530                 :        7367 :   bbPtr->condQuad = 0;
    2531                 :        7367 :   bbPtr->nextBB = 0;
    2532                 :        7367 :   bbPtr->condBB = 0;
    2533                 :        7367 :   bbPtr->next = NULL;
    2534                 :        7367 :   DetectTrash (bbPtr);
    2535                 :        7367 :   Indexing_PutIndice (bbArray, high+1, reinterpret_cast <void *> (bbPtr));
    2536                 :        7367 : }
    2537                 :             : 
    2538                 :             : 
    2539                 :             : /*
    2540                 :             :    DumpAlias -
    2541                 :             : */
    2542                 :             : 
    2543                 :           0 : static void DumpAlias (Indexing_Index array, unsigned int aliasIndex)
    2544                 :             : {
    2545                 :           0 :   M2SymInit_symAlias sa;
    2546                 :             : 
    2547                 :           0 :   sa = static_cast<M2SymInit_symAlias> (Indexing_GetIndice (array, aliasIndex));
    2548                 :           0 :   M2Printf_printf2 ((const char *) "keySym = %d: alias = %d\\n", 25, (const unsigned char *) &sa->keySym, (sizeof (sa->keySym)-1), (const unsigned char *) &sa->alias, (sizeof (sa->alias)-1));
    2549                 :           0 : }
    2550                 :             : 
    2551                 :             : 
    2552                 :             : /*
    2553                 :             :    doDumpAliases -
    2554                 :             : */
    2555                 :             : 
    2556                 :           0 : static void doDumpAliases (Indexing_Index array)
    2557                 :             : {
    2558                 :           0 :   unsigned int i;
    2559                 :           0 :   unsigned int n;
    2560                 :             : 
    2561                 :           0 :   i = 1;
    2562                 :           0 :   n = Indexing_HighIndice (array);
    2563                 :           0 :   while (i <= n)
    2564                 :             :     {
    2565                 :           0 :       DumpAlias (array, i);
    2566                 :           0 :       i += 1;
    2567                 :             :     }
    2568                 :           0 : }
    2569                 :             : 
    2570                 :             : 
    2571                 :             : /*
    2572                 :             :    DumpAliases -
    2573                 :             : */
    2574                 :             : 
    2575                 :         654 : static void DumpAliases (void)
    2576                 :             : {
    2577                 :         654 :   if (Debugging)
    2578                 :             :     {
    2579                 :             :       M2Printf_printf0 ((const char *) "LArray\\n", 8);
    2580                 :             :       doDumpAliases (LArray);
    2581                 :             :       M2Printf_printf0 ((const char *) "IndirectArray\\n", 15);
    2582                 :             :       doDumpAliases (IndirectArray);
    2583                 :             :     }
    2584                 :         654 : }
    2585                 :             : 
    2586                 :             : 
    2587                 :             : /*
    2588                 :             :    newAlias -
    2589                 :             : */
    2590                 :             : 
    2591                 :        2764 : static M2SymInit_symAlias newAlias (void)
    2592                 :             : {
    2593                 :        2764 :   M2SymInit_symAlias sa;
    2594                 :             : 
    2595                 :        2764 :   if (freeList == NULL)
    2596                 :             :     {
    2597                 :        1124 :       Storage_ALLOCATE ((void **) &sa, sizeof (M2SymInit__T2));
    2598                 :             :     }
    2599                 :             :   else
    2600                 :             :     {
    2601                 :        1640 :       sa = freeList;
    2602                 :        1640 :       freeList = freeList->next;
    2603                 :             :     }
    2604                 :        2764 :   return sa;
    2605                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    2606                 :             :   __builtin_unreachable ();
    2607                 :             : }
    2608                 :             : 
    2609                 :             : 
    2610                 :             : /*
    2611                 :             :    initAlias -
    2612                 :             : */
    2613                 :             : 
    2614                 :        2764 : static M2SymInit_symAlias initAlias (unsigned int sym)
    2615                 :             : {
    2616                 :        2764 :   M2SymInit_symAlias sa;
    2617                 :             : 
    2618                 :           0 :   sa = newAlias ();
    2619                 :        2764 :   sa->keySym = sym;
    2620                 :        2764 :   sa->alias = SymbolTable_NulSym;
    2621                 :        2764 :   sa->next = NULL;
    2622                 :        2764 :   return sa;
    2623                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    2624                 :             :   __builtin_unreachable ();
    2625                 :             : }
    2626                 :             : 
    2627                 :             : 
    2628                 :             : /*
    2629                 :             :    killAlias -
    2630                 :             : */
    2631                 :             : 
    2632                 :        2764 : static void killAlias (M2SymInit_symAlias sa)
    2633                 :             : {
    2634                 :        2764 :   sa->next = freeList;
    2635                 :        2764 :   freeList = sa;
    2636                 :           0 : }
    2637                 :             : 
    2638                 :             : 
    2639                 :             : /*
    2640                 :             :    initBlock -
    2641                 :             : */
    2642                 :             : 
    2643                 :        2946 : static void initBlock (void)
    2644                 :             : {
    2645                 :        2946 :   LArray = Indexing_InitIndex (1);
    2646                 :        2946 :   IndirectArray = Indexing_InitIndex (1);
    2647                 :        2946 :   Lists_InitList (&ignoreList);
    2648                 :        2946 : }
    2649                 :             : 
    2650                 :             : 
    2651                 :             : /*
    2652                 :             :    killBlock -
    2653                 :             : */
    2654                 :             : 
    2655                 :        2946 : static void killBlock (void)
    2656                 :             : {
    2657                 :        2946 :   doKillBlock (&LArray);
    2658                 :        2946 :   doKillBlock (&IndirectArray);
    2659                 :        2946 :   Lists_KillList (&ignoreList);
    2660                 :        2946 : }
    2661                 :             : 
    2662                 :             : 
    2663                 :             : /*
    2664                 :             :    killBlock -
    2665                 :             : */
    2666                 :             : 
    2667                 :        5892 : static void doKillBlock (Indexing_Index *array)
    2668                 :             : {
    2669                 :        5892 :   unsigned int i;
    2670                 :        5892 :   unsigned int n;
    2671                 :             : 
    2672                 :        5892 :   i = 1;
    2673                 :        5892 :   n = Indexing_HighIndice ((*array));
    2674                 :       14548 :   while (i <= n)
    2675                 :             :     {
    2676                 :        2764 :       killAlias (reinterpret_cast <M2SymInit_symAlias> (Indexing_GetIndice ((*array), i)));
    2677                 :        2764 :       i += 1;
    2678                 :             :     }
    2679                 :        5892 :   (*array) = Indexing_KillIndex ((*array));
    2680                 :        5892 : }
    2681                 :             : 
    2682                 :             : 
    2683                 :             : /*
    2684                 :             :    addAlias -
    2685                 :             : */
    2686                 :             : 
    2687                 :        2812 : static void addAlias (Indexing_Index array, unsigned int sym, unsigned int aliased)
    2688                 :             : {
    2689                 :        2812 :   unsigned int i;
    2690                 :        2812 :   unsigned int n;
    2691                 :        2812 :   M2SymInit_symAlias sa;
    2692                 :             : 
    2693                 :        2812 :   i = 1;
    2694                 :        2812 :   n = Indexing_HighIndice (array);
    2695                 :        7948 :   while (i <= n)
    2696                 :             :     {
    2697                 :        2372 :       sa = static_cast<M2SymInit_symAlias> (Indexing_GetIndice (array, i));
    2698                 :        2372 :       if (sa->keySym == sym)
    2699                 :             :         {
    2700                 :          48 :           sa->alias = aliased;
    2701                 :          48 :           return;
    2702                 :             :         }
    2703                 :        2324 :       i += 1;
    2704                 :             :     }
    2705                 :        2764 :   sa = initAlias (sym);
    2706                 :        2764 :   Indexing_IncludeIndiceIntoIndex (array, reinterpret_cast <void *> (sa));
    2707                 :        2764 :   sa->alias = aliased;
    2708                 :             : }
    2709                 :             : 
    2710                 :             : 
    2711                 :             : /*
    2712                 :             :    lookupAlias -
    2713                 :             : */
    2714                 :             : 
    2715                 :        2754 : static M2SymInit_symAlias lookupAlias (Indexing_Index array, unsigned int sym)
    2716                 :             : {
    2717                 :        2754 :   unsigned int i;
    2718                 :        2754 :   unsigned int n;
    2719                 :        2754 :   M2SymInit_symAlias sa;
    2720                 :             : 
    2721                 :        2754 :   i = 1;
    2722                 :        2754 :   n = Indexing_HighIndice (array);
    2723                 :        8598 :   while (i <= n)
    2724                 :             :     {
    2725                 :        4974 :       sa = static_cast<M2SymInit_symAlias> (Indexing_GetIndice (array, i));
    2726                 :        4974 :       if (sa->keySym == sym)
    2727                 :             :         {
    2728                 :             :           return sa;
    2729                 :             :         }
    2730                 :        3090 :       i += 1;
    2731                 :             :     }
    2732                 :             :   return NULL;
    2733                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    2734                 :             :   __builtin_unreachable ();
    2735                 :             : }
    2736                 :             : 
    2737                 :             : 
    2738                 :             : /*
    2739                 :             :    doGetAlias -
    2740                 :             : */
    2741                 :             : 
    2742                 :        2754 : static unsigned int doGetAlias (Indexing_Index array, unsigned int sym)
    2743                 :             : {
    2744                 :        2754 :   M2SymInit_symAlias sa;
    2745                 :             : 
    2746                 :           0 :   sa = lookupAlias (array, sym);
    2747                 :        2754 :   if ((sa != NULL) && (sa->alias != SymbolTable_NulSym))
    2748                 :             :     {
    2749                 :             :       return sa->alias;
    2750                 :             :     }
    2751                 :             :   return SymbolTable_NulSym;
    2752                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    2753                 :             :   __builtin_unreachable ();
    2754                 :             : }
    2755                 :             : 
    2756                 :             : 
    2757                 :             : /*
    2758                 :             :    getLAlias - attempts to looks up an alias which is not a temporary variable.
    2759                 :             : */
    2760                 :             : 
    2761                 :        1482 : static unsigned int getLAlias (unsigned int sym)
    2762                 :             : {
    2763                 :        1482 :   unsigned int type;
    2764                 :        1482 :   unsigned int nsym;
    2765                 :             : 
    2766                 :        1482 :   nsym = sym;
    2767                 :        2730 :   do {
    2768                 :        2730 :     sym = nsym;
    2769                 :        2730 :     type = SymbolTable_GetSType (sym);
    2770                 :        2730 :     if (((SymbolTable_IsTemporary (sym)) && ((SymbolTable_GetMode (sym)) == SymbolTable_LeftValue)) || ((type != SymbolTable_NulSym) && (SymbolTable_IsReallyPointer (type))))
    2771                 :             :       {
    2772                 :        2022 :         nsym = doGetAlias (LArray, sym);
    2773                 :             :       }
    2774                 :             :     else
    2775                 :             :       {
    2776                 :         708 :         return sym;
    2777                 :             :       }
    2778                 :        2022 :   } while (! (nsym == SymbolTable_NulSym));
    2779                 :             :   return sym;
    2780                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    2781                 :             :   __builtin_unreachable ();
    2782                 :             : }
    2783                 :             : 
    2784                 :             : 
    2785                 :             : /*
    2786                 :             :    SetupLAlias -
    2787                 :             : */
    2788                 :             : 
    2789                 :        1067 : static void SetupLAlias (unsigned int des, unsigned int exp)
    2790                 :             : {
    2791                 :        1067 :   if ((exp == M2Base_Nil) || ((SymbolTable_IsVar (exp)) && (((SymbolTable_GetMode (des)) == SymbolTable_LeftValue) || (SymbolTable_IsReallyPointer (SymbolTable_GetSType (des))))))
    2792                 :             :     {
    2793                 :         654 :       addAlias (LArray, des, exp);
    2794                 :         654 :       DumpAliases ();
    2795                 :             :     }
    2796                 :        1067 : }
    2797                 :             : 
    2798                 :             : 
    2799                 :             : /*
    2800                 :             :    SetupIndr -
    2801                 :             : */
    2802                 :             : 
    2803                 :        2158 : static void SetupIndr (unsigned int ptr, unsigned int content)
    2804                 :             : {
    2805                 :        2158 :   addAlias (IndirectArray, ptr, content);
    2806                 :           0 : }
    2807                 :             : 
    2808                 :             : 
    2809                 :             : /*
    2810                 :             :    getContent - attempts to return the content pointed to by ptr.
    2811                 :             :                 sym is the original symbol and ptr will be the equivalent lvalue.
    2812                 :             : */
    2813                 :             : 
    2814                 :         756 : static unsigned int getContent (unsigned int ptr, unsigned int sym, unsigned int tok)
    2815                 :             : {
    2816                 :         756 :   if (ptr == M2Base_Nil)
    2817                 :             :     {
    2818                 :          24 :       M2MetaError_MetaErrorT1 (tok, (const char *) "attempting to dereference {%1Wad} which will be a {%kNIL} pointer", 65, sym);
    2819                 :          24 :       return SymbolTable_NulSym;
    2820                 :             :     }
    2821                 :             :   else
    2822                 :             :     {
    2823                 :         732 :       return doGetAlias (IndirectArray, ptr);
    2824                 :             :     }
    2825                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    2826                 :             :   __builtin_unreachable ();
    2827                 :             : }
    2828                 :             : 
    2829                 :             : 
    2830                 :             : /*
    2831                 :             :    init -
    2832                 :             : */
    2833                 :             : 
    2834                 :       15392 : static void init (void)
    2835                 :             : {
    2836                 :       15392 :   freeList = NULL;
    2837                 :       15392 :   bbFreeList = NULL;
    2838                 :           0 :   Lists_InitList (&errorList);
    2839                 :           0 : }
    2840                 :             : 
    2841                 :             : 
    2842                 :             : /*
    2843                 :             :    PrintSymInit -
    2844                 :             : */
    2845                 :             : 
    2846                 :    15484038 : extern "C" M2SymInit_InitDesc M2SymInit_InitSymInit (void)
    2847                 :             : {
    2848                 :    15484038 :   M2SymInit_InitDesc__opaque id;
    2849                 :             : 
    2850                 :    15484038 :   Storage_ALLOCATE ((void **) &id, sizeof (M2SymInit__T1));
    2851                 :    15484038 :   id->sym = SymbolTable_NulSym;
    2852                 :    15484038 :   id->type = SymbolTable_NulSym;
    2853                 :    15484038 :   id->initialized = true;
    2854                 :    15484038 :   id->kind = M2SymInit_scalar;
    2855                 :    15484038 :   return static_cast<M2SymInit_InitDesc> (id);
    2856                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    2857                 :             :   __builtin_unreachable ();
    2858                 :             : }
    2859                 :             : 
    2860                 :             : 
    2861                 :             : /*
    2862                 :             :    PrintSymInit -
    2863                 :             : */
    2864                 :             : 
    2865                 :           0 : extern "C" void M2SymInit_KillSymInit (M2SymInit_InitDesc *desc)
    2866                 :             : {
    2867                 :           0 :   switch (static_cast<M2SymInit_InitDesc__opaque> ((*desc))->kind)
    2868                 :             :     {
    2869                 :           0 :       case M2SymInit_record:
    2870                 :           0 :         KillFieldDesc (&static_cast<M2SymInit_InitDesc__opaque> ((*desc))->rec.fieldDesc);
    2871                 :           0 :         break;
    2872                 :             : 
    2873                 :             : 
    2874                 :             :       default:
    2875                 :             :         break;
    2876                 :             :     }
    2877                 :           0 :   Storage_DEALLOCATE ((void **) &(*desc), sizeof (M2SymInit__T1));
    2878                 :           0 :   (*desc) = static_cast<M2SymInit_InitDesc> (NULL);
    2879                 :           0 : }
    2880                 :             : 
    2881                 :             : 
    2882                 :             : /*
    2883                 :             :    PrintSymInit -
    2884                 :             : */
    2885                 :             : 
    2886                 :    15118638 : extern "C" void M2SymInit_ConfigSymInit (M2SymInit_InitDesc desc, unsigned int sym)
    2887                 :             : {
    2888                 :    15118638 :   if ((SymbolTable_IsVar (sym)) || (SymbolTable_IsRecordField (sym)))
    2889                 :             :     {
    2890                 :    15118218 :       static_cast<M2SymInit_InitDesc__opaque> (desc)->sym = sym;
    2891                 :    15118218 :       static_cast<M2SymInit_InitDesc__opaque> (desc)->type = SymbolTable_GetSType (sym);
    2892                 :    15118218 :       static_cast<M2SymInit_InitDesc__opaque> (desc)->initialized = false;
    2893                 :    15118218 :       if (SymbolTable_IsRecord (static_cast<M2SymInit_InitDesc__opaque> (desc)->type))
    2894                 :             :         {
    2895                 :       68824 :           static_cast<M2SymInit_InitDesc__opaque> (desc)->kind = M2SymInit_record;
    2896                 :       68824 :           static_cast<M2SymInit_InitDesc__opaque> (desc)->rec.fieldDesc = Indexing_InitIndex (1);
    2897                 :       68824 :           PopulateFields (static_cast<M2SymInit_InitDesc__opaque> (desc), static_cast<M2SymInit_InitDesc__opaque> (desc)->type);
    2898                 :             :         }
    2899                 :             :       else
    2900                 :             :         {
    2901                 :    15049394 :           static_cast<M2SymInit_InitDesc__opaque> (desc)->kind = M2SymInit_scalar;
    2902                 :    15049394 :           if (SymbolTable_IsArray (static_cast<M2SymInit_InitDesc__opaque> (desc)->type))
    2903                 :             :             {
    2904                 :      172128 :               static_cast<M2SymInit_InitDesc__opaque> (desc)->initialized = true;  /* For now we don't attempt to handle array types.  */
    2905                 :             :             }
    2906                 :             :         }
    2907                 :             :     }
    2908                 :    15118638 : }
    2909                 :             : 
    2910                 :             : 
    2911                 :             : /*
    2912                 :             :    PopulateFields -
    2913                 :             : */
    2914                 :             : 
    2915                 :        5769 : extern "C" void M2SymInit_SetInitialized (M2SymInit_InitDesc desc)
    2916                 :             : {
    2917                 :        5769 :   static_cast<M2SymInit_InitDesc__opaque> (desc)->initialized = true;
    2918                 :        5769 : }
    2919                 :             : 
    2920                 :             : 
    2921                 :             : /*
    2922                 :             :    PopulateFields -
    2923                 :             : */
    2924                 :             : 
    2925                 :        2872 : extern "C" bool M2SymInit_GetInitialized (M2SymInit_InitDesc desc)
    2926                 :             : {
    2927                 :        2872 :   if (! static_cast<M2SymInit_InitDesc__opaque> (desc)->initialized)
    2928                 :             :     {
    2929                 :         367 :       if (SymbolTable_IsRecord (static_cast<M2SymInit_InitDesc__opaque> (desc)->type))
    2930                 :             :         {
    2931                 :         108 :           TrySetInitialized (static_cast<M2SymInit_InitDesc__opaque> (desc));
    2932                 :             :         }
    2933                 :             :     }
    2934                 :        2872 :   if (Debugging)
    2935                 :             :     {
    2936                 :             :       M2SymInit_PrintSymInit (desc);
    2937                 :             :     }
    2938                 :        2872 :   return static_cast<M2SymInit_InitDesc__opaque> (desc)->initialized;
    2939                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    2940                 :             :   __builtin_unreachable ();
    2941                 :             : }
    2942                 :             : 
    2943                 :             : 
    2944                 :             : /*
    2945                 :             :    PopulateFields -
    2946                 :             : */
    2947                 :             : 
    2948                 :        1080 : extern "C" M2SymInit_InitDesc M2SymInit_GetFieldDesc (M2SymInit_InitDesc desc, unsigned int field)
    2949                 :             : {
    2950                 :        1080 :   unsigned int fsym;
    2951                 :        1080 :   unsigned int i;
    2952                 :             : 
    2953                 :        1080 :   if (SymbolTable_IsRecord (static_cast<M2SymInit_InitDesc__opaque> (desc)->type))
    2954                 :             :     {
    2955                 :             :       i = 1;
    2956                 :        1506 :       do {
    2957                 :        1506 :         fsym = SymbolTable_GetNth (static_cast<M2SymInit_InitDesc__opaque> (desc)->type, i);
    2958                 :        1506 :         if (field == fsym)
    2959                 :             :           {
    2960                 :        1008 :             return static_cast<M2SymInit_InitDesc> (Indexing_GetIndice (static_cast<M2SymInit_InitDesc__opaque> (desc)->rec.fieldDesc, i));
    2961                 :             :           }
    2962                 :         498 :         i += 1;
    2963                 :         498 :       } while (! (fsym == SymbolTable_NulSym));
    2964                 :             :     }
    2965                 :             :   return static_cast<M2SymInit_InitDesc> (NULL);
    2966                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    2967                 :             :   __builtin_unreachable ();
    2968                 :             : }
    2969                 :             : 
    2970                 :             : 
    2971                 :             : /*
    2972                 :             :    PopulateFields -
    2973                 :             : */
    2974                 :             : 
    2975                 :         684 : extern "C" bool M2SymInit_SetFieldInitialized (M2SymInit_InitDesc desc, Lists_List fieldlist)
    2976                 :             : {
    2977                 :         684 :   return SetFieldInitializedNo (static_cast<M2SymInit_InitDesc__opaque> (desc), fieldlist, 1);
    2978                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    2979                 :             :   __builtin_unreachable ();
    2980                 :             : }
    2981                 :             : 
    2982                 :             : 
    2983                 :             : /*
    2984                 :             :    SetFieldInitializedNo -
    2985                 :             : */
    2986                 :             : 
    2987                 :         204 : extern "C" bool M2SymInit_GetFieldInitialized (M2SymInit_InitDesc desc, Lists_List fieldlist)
    2988                 :             : {
    2989                 :         204 :   return GetFieldInitializedNo (static_cast<M2SymInit_InitDesc__opaque> (desc), fieldlist, 1);
    2990                 :             :   /* static analysis guarentees a RETURN statement will be used before here.  */
    2991                 :             :   __builtin_unreachable ();
    2992                 :             : }
    2993                 :             : 
    2994                 :             : 
    2995                 :             : /*
    2996                 :             :    ScopeBlockVariableAnalysis - checks to see whether a variable is
    2997                 :             :                                 read before it has been initialized.
    2998                 :             : */
    2999                 :             : 
    3000                 :      316541 : extern "C" void M2SymInit_ScopeBlockVariableAnalysis (unsigned int Scope, unsigned int Start, unsigned int End)
    3001                 :             : {
    3002                 :      316541 :   M2BasicBlock_BasicBlock bb;
    3003                 :      316541 :   Lists_List lst;
    3004                 :             : 
    3005                 :      316541 :   if (M2Options_UninitVariableChecking)
    3006                 :             :     {
    3007                 :        2840 :       bbArray = Indexing_InitIndex (1);
    3008                 :        2840 :       bb = M2BasicBlock_InitBasicBlocksFromRange (Scope, Start, End);
    3009                 :        2840 :       M2BasicBlock_ForeachBasicBlockDo (bb, (M2BasicBlock_BasicBlockProc) {(M2BasicBlock_BasicBlockProc_t) AppendEntry});
    3010                 :        2840 :       M2BasicBlock_KillBasicBlocks (&bb);
    3011                 :        2840 :       GenerateCFG ();
    3012                 :        2840 :       if (Scope != SymbolTable_NulSym)
    3013                 :             :         {
    3014                 :        2840 :           Lists_InitList (&lst);
    3015                 :        2840 :           if (Debugging)
    3016                 :             :             {
    3017                 :             :               DumpBBArray (Scope);
    3018                 :             :               if (M2Options_UninitVariableConditionalChecking)
    3019                 :             :                 {
    3020                 :             :                   M2Printf_printf0 ((const char *) "UninitVariableConditionalChecking is TRUE\\n", 43);
    3021                 :             :                 }
    3022                 :             :             }
    3023                 :        2840 :           CreateBBPermultations (Scope, 1, lst);
    3024                 :        2840 :           Lists_KillList (&lst);
    3025                 :             :         }
    3026                 :        2840 :       bbArrayKill ();
    3027                 :             :     }
    3028                 :      316541 : }
    3029                 :             : 
    3030                 :             : 
    3031                 :             : /*
    3032                 :             :    PrintSymInit -
    3033                 :             : */
    3034                 :             : 
    3035                 :           0 : extern "C" void M2SymInit_PrintSymInit (M2SymInit_InitDesc desc)
    3036                 :             : {
    3037                 :           0 :   unsigned int i;
    3038                 :           0 :   unsigned int n;
    3039                 :             : 
    3040                 :           0 :   libc_printf ((const char *) "sym %d: type %d ", 16, static_cast<M2SymInit_InitDesc__opaque> (desc)->sym, static_cast<M2SymInit_InitDesc__opaque> (desc)->type);
    3041                 :           0 :   if (static_cast<M2SymInit_InitDesc__opaque> (desc)->kind == M2SymInit_scalar)
    3042                 :             :     {
    3043                 :           0 :       libc_printf ((const char *) "scalar", 6);
    3044                 :             :     }
    3045                 :             :   else
    3046                 :             :     {
    3047                 :           0 :       libc_printf ((const char *) "record", 6);
    3048                 :             :     }
    3049                 :           0 :   if (! static_cast<M2SymInit_InitDesc__opaque> (desc)->initialized)
    3050                 :             :     {
    3051                 :           0 :       libc_printf ((const char *) " not", 4);
    3052                 :             :     }
    3053                 :           0 :   libc_printf ((const char *) " initialized\\n", 14);
    3054                 :           0 :   if ((static_cast<M2SymInit_InitDesc__opaque> (desc)->type != SymbolTable_NulSym) && (SymbolTable_IsRecord (static_cast<M2SymInit_InitDesc__opaque> (desc)->type)))
    3055                 :             :     {
    3056                 :           0 :       i = 1;
    3057                 :           0 :       n = Indexing_HighIndice (static_cast<M2SymInit_InitDesc__opaque> (desc)->rec.fieldDesc);
    3058                 :           0 :       while (i <= n)
    3059                 :             :         {
    3060                 :           0 :           M2SymInit_PrintSymInit (static_cast<M2SymInit_InitDesc> (Indexing_GetIndice (static_cast<M2SymInit_InitDesc__opaque> (desc)->rec.fieldDesc, i)));
    3061                 :           0 :           i += 1;
    3062                 :             :         }
    3063                 :             :     }
    3064                 :           0 : }
    3065                 :             : 
    3066                 :       15392 : extern "C" void _M2_M2SymInit_init (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
    3067                 :             : {
    3068                 :       15392 :   init ();
    3069                 :       15392 : }
    3070                 :             : 
    3071                 :           0 : extern "C" void _M2_M2SymInit_fini (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
    3072                 :             : {
    3073                 :           0 : }
        

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.