Added a comment about se.info.type being used uninitialized
[ghc-hetmet.git] / rts / RetainerProfile.c
index c5c3de5..17f5afb 100644 (file)
 #include "RtsUtils.h"
 #include "RetainerProfile.h"
 #include "RetainerSet.h"
+#include "Storage.h"
 #include "Schedule.h"
+#include "Stable.h"
 #include "Printer.h"
-#include "Storage.h"
 #include "RtsFlags.h"
 #include "Weak.h"
 #include "Sanity.h"
 #include "Profiling.h"
 #include "Stats.h"
-#include "BlockAlloc.h"
 #include "ProfHeap.h"
 #include "Apply.h"
 
@@ -591,8 +591,8 @@ push( StgClosure *c, retainer c_child_r, StgClosure **first_child )
            return;     // no child
        break;
        
-    case TVAR_WAIT_QUEUE:
-       *first_child = (StgClosure *)((StgTVarWaitQueue *)c)->waiting_tso;
+    case TVAR_WATCH_QUEUE:
+       *first_child = (StgClosure *)((StgTVarWatchQueue *)c)->closure;
        se.info.next.step = 2;            // 2 = second
        break;
     case TVAR:
@@ -612,8 +612,6 @@ push( StgClosure *c, retainer c_child_r, StgClosure **first_child )
     case AP_STACK:
     case TSO:
     case IND_STATIC:
-    case CONSTR_INTLIKE:
-    case CONSTR_CHARLIKE:
     case CONSTR_NOCAF_STATIC:
        // stack objects
     case UPDATE_FRAME:
@@ -664,6 +662,12 @@ push( StgClosure *c, retainer c_child_r, StgClosure **first_child )
     // following statement by either a memcpy() call or a switch statement
     // on the type of the element. Currently, the size of stackElement is
     // small enough (5 words) that this direct assignment seems to be enough.
+
+    // ToDo: The line below leads to the warning:
+    //    warning: 'se.info.type' may be used uninitialized in this function
+    // This is caused by the fact that there are execution paths through the
+    // large switch statement above where some cases do not initialize this
+    // field. Is this really harmless? Can we avoid the warning?
     *stackTop = se;
 
 #ifdef DEBUG_RETAINER
@@ -832,13 +836,13 @@ pop( StgClosure **c, StgClosure **cp, retainer *r )
            *r = se->c_child_r;
            return;
 
-       case TVAR_WAIT_QUEUE:
+       case TVAR_WATCH_QUEUE:
            if (se->info.next.step == 2) {
-               *c = (StgClosure *)((StgTVarWaitQueue *)se->c)->next_queue_entry;
+               *c = (StgClosure *)((StgTVarWatchQueue *)se->c)->next_queue_entry;
                se->info.next.step++;             // move to the next step
                // no popOff
            } else {
-               *c = (StgClosure *)((StgTVarWaitQueue *)se->c)->prev_queue_entry;
+               *c = (StgClosure *)((StgTVarWatchQueue *)se->c)->prev_queue_entry;
                popOff();
            }
            *cp = se->c;
@@ -846,7 +850,7 @@ pop( StgClosure **c, StgClosure **cp, retainer *r )
            return;
 
        case TVAR:
-           *c = (StgClosure *)((StgTVar *)se->c)->first_wait_queue_entry;
+           *c = (StgClosure *)((StgTVar *)se->c)->first_watch_queue_entry;
            *cp = se->c;
            *r = se->c_child_r;
            popOff();
@@ -974,8 +978,6 @@ pop( StgClosure **c, StgClosure **cp, retainer *r )
        case AP_STACK:
        case TSO:
        case IND_STATIC:
-       case CONSTR_INTLIKE:
-       case CONSTR_CHARLIKE:
        case CONSTR_NOCAF_STATIC:
            // stack objects
        case RET_DYN:
@@ -1129,7 +1131,7 @@ isRetainer( StgClosure *c )
     case BCO:
     case ARR_WORDS:
        // STM
-    case TVAR_WAIT_QUEUE:
+    case TVAR_WATCH_QUEUE:
     case TREC_HEADER:
     case TREC_CHUNK:
        return rtsFalse;
@@ -1139,10 +1141,8 @@ isRetainer( StgClosure *c )
        //
        // IND_STATIC cannot be *c, *cp, *r in the retainer profiling loop.
     case IND_STATIC:
-       // CONSTR_INTLIKE, CONSTR_CHARLIKE, and CONSTR_NOCAF_STATIC
+       // CONSTR_NOCAF_STATIC
        // cannot be *c, *cp, *r in the retainer profiling loop.
-    case CONSTR_INTLIKE:
-    case CONSTR_CHARLIKE:
     case CONSTR_NOCAF_STATIC:
        // Stack objects are invalid because they are never treated as
        // legal objects during retainer profiling.
@@ -1609,8 +1609,6 @@ inner_loop:
 #ifdef DEBUG_RETAINER
     switch (typeOfc) {
     case IND_STATIC:
-    case CONSTR_INTLIKE:
-    case CONSTR_CHARLIKE:
     case CONSTR_NOCAF_STATIC:
     case CONSTR_STATIC:
     case THUNK_STATIC:
@@ -1648,8 +1646,6 @@ inner_loop:
        // We just skip IND_STATIC, so its retainer set is never computed.
        c = ((StgIndStatic *)c)->indirectee;
        goto inner_loop;
-    case CONSTR_INTLIKE:
-    case CONSTR_CHARLIKE:
        // static objects with no pointers out, so goto loop.
     case CONSTR_NOCAF_STATIC:
        // It is not just enough not to compute the retainer set for *c; it is
@@ -1880,8 +1876,6 @@ computeRetainerSet( void )
                    case IND_STATIC:
                        // no cost involved
                        break;
-                   case CONSTR_INTLIKE:
-                   case CONSTR_CHARLIKE:
                    case CONSTR_NOCAF_STATIC:
                    case CONSTR_STATIC:
                    case THUNK_STATIC:
@@ -2012,8 +2006,6 @@ retainerProfile(void)
   pcostArrayLinear(FUN_STATIC);
   pcostArrayLinear(CONSTR_STATIC);
   pcostArrayLinear(CONSTR_NOCAF_STATIC);
-  pcostArrayLinear(CONSTR_INTLIKE);
-  pcostArrayLinear(CONSTR_CHARLIKE);
 */
 #endif