@@ -676,11 +676,11 @@ void BasicBlock::dspKind() const
676
676
break ;
677
677
678
678
case BBJ_EHFILTERRET:
679
- printf (" -> %s (fltret)" , dspBlockNum (bbTarget ));
679
+ printf (" -> %s (fltret)" , dspBlockNum (GetTarget () ));
680
680
break ;
681
681
682
682
case BBJ_EHCATCHRET:
683
- printf (" -> %s (cret)" , dspBlockNum (bbTarget ));
683
+ printf (" -> %s (cret)" , dspBlockNum (GetTarget () ));
684
684
break ;
685
685
686
686
case BBJ_THROW:
@@ -694,28 +694,28 @@ void BasicBlock::dspKind() const
694
694
case BBJ_ALWAYS:
695
695
if (HasFlag (BBF_KEEP_BBJ_ALWAYS))
696
696
{
697
- printf (" -> %s (ALWAYS)" , dspBlockNum (bbTarget ));
697
+ printf (" -> %s (ALWAYS)" , dspBlockNum (GetTarget () ));
698
698
}
699
699
else
700
700
{
701
- printf (" -> %s (always)" , dspBlockNum (bbTarget ));
701
+ printf (" -> %s (always)" , dspBlockNum (GetTarget () ));
702
702
}
703
703
break ;
704
704
705
705
case BBJ_LEAVE:
706
- printf (" -> %s (leave)" , dspBlockNum (bbTarget ));
706
+ printf (" -> %s (leave)" , dspBlockNum (GetTarget () ));
707
707
break ;
708
708
709
709
case BBJ_CALLFINALLY:
710
- printf (" -> %s (callf)" , dspBlockNum (bbTarget ));
710
+ printf (" -> %s (callf)" , dspBlockNum (GetTarget () ));
711
711
break ;
712
712
713
713
case BBJ_CALLFINALLYRET:
714
- printf (" -> %s (callfr)" , dspBlockNum (bbTarget ));
714
+ printf (" -> %s (callfr)" , dspBlockNum (GetTarget () ));
715
715
break ;
716
716
717
717
case BBJ_COND:
718
- printf (" -> %s,%s (cond)" , dspBlockNum (bbTrueTarget) , dspBlockNum (bbFalseTarget ));
718
+ printf (" -> %s,%s (cond)" , dspBlockNum (GetTrueTarget ()) , dspBlockNum (GetFalseTarget () ));
719
719
break ;
720
720
721
721
case BBJ_SWITCH:
@@ -857,22 +857,27 @@ void BasicBlock::TransferTarget(BasicBlock* from)
857
857
SetEhf (from->GetEhfTargets ());
858
858
from->bbEhfTargets = nullptr ; // Make sure nobody uses the descriptor after this.
859
859
break ;
860
+
861
+ // TransferTarget may be called after setting the source block of `from`'s
862
+ // successor edges to this block.
863
+ // This means calling GetTarget/GetTrueTarget/GetFalseTarget would trigger asserts.
864
+ // Avoid this by accessing the edges directly.
860
865
case BBJ_COND:
861
- SetCond (from->GetTrueTarget () , from->GetFalseTarget () );
866
+ SetCond (from->bbTrueEdge , from->bbFalseEdge );
862
867
break ;
863
868
case BBJ_ALWAYS:
864
- SetKindAndTarget (from-> GetKind () , from->GetTarget () );
869
+ SetKindAndTargetEdge (BBJ_ALWAYS , from->bbTargetEdge );
865
870
CopyFlags (from, BBF_NONE_QUIRK);
866
871
break ;
867
872
case BBJ_CALLFINALLY:
868
873
case BBJ_CALLFINALLYRET:
869
874
case BBJ_EHCATCHRET:
870
875
case BBJ_EHFILTERRET:
871
876
case BBJ_LEAVE:
872
- SetKindAndTarget (from->GetKind (), from->GetTarget () );
877
+ SetKindAndTargetEdge (from->GetKind (), from->bbTargetEdge );
873
878
break ;
874
879
default :
875
- SetKindAndTarget (from->GetKind ()); // Clear the target
880
+ SetKindAndTargetEdge (from->GetKind ()); // Clear the target
876
881
break ;
877
882
}
878
883
assert (KindIs (from->GetKind ()));
@@ -985,7 +990,7 @@ BasicBlock* BasicBlock::GetUniquePred(Compiler* compiler) const
985
990
//
986
991
BasicBlock* BasicBlock::GetUniqueSucc () const
987
992
{
988
- return KindIs (BBJ_ALWAYS) ? bbTarget : nullptr ;
993
+ return KindIs (BBJ_ALWAYS) ? GetTarget () : nullptr ;
989
994
}
990
995
991
996
// Static vars.
@@ -1145,7 +1150,7 @@ unsigned BasicBlock::NumSucc() const
1145
1150
return 1 ;
1146
1151
1147
1152
case BBJ_COND:
1148
- if (bbTrueTarget == bbFalseTarget )
1153
+ if (bbTrueEdge == bbFalseEdge )
1149
1154
{
1150
1155
return 1 ;
1151
1156
}
@@ -1199,18 +1204,18 @@ BasicBlock* BasicBlock::GetSucc(unsigned i) const
1199
1204
case BBJ_EHCATCHRET:
1200
1205
case BBJ_EHFILTERRET:
1201
1206
case BBJ_LEAVE:
1202
- return bbTarget ;
1207
+ return GetTarget () ;
1203
1208
1204
1209
case BBJ_COND:
1205
1210
if (i == 0 )
1206
1211
{
1207
- return bbFalseTarget ;
1212
+ return GetFalseTarget () ;
1208
1213
}
1209
1214
else
1210
1215
{
1211
1216
assert (i == 1 );
1212
- assert (bbFalseTarget != bbTrueTarget );
1213
- return bbTrueTarget ;
1217
+ assert (bbTrueEdge != bbFalseEdge );
1218
+ return GetTrueTarget () ;
1214
1219
}
1215
1220
1216
1221
case BBJ_EHFINALLYRET:
@@ -1270,7 +1275,7 @@ unsigned BasicBlock::NumSucc(Compiler* comp)
1270
1275
return 1 ;
1271
1276
1272
1277
case BBJ_COND:
1273
- if (bbTrueTarget == bbFalseTarget )
1278
+ if (bbTrueEdge == bbFalseEdge )
1274
1279
{
1275
1280
return 1 ;
1276
1281
}
@@ -1309,8 +1314,8 @@ BasicBlock* BasicBlock::GetSucc(unsigned i, Compiler* comp)
1309
1314
{
1310
1315
case BBJ_EHFILTERRET:
1311
1316
// Handler is the (sole) normal successor of the filter.
1312
- assert (comp->fgFirstBlockOfHandler (this ) == bbTarget );
1313
- return bbTarget ;
1317
+ assert (comp->fgFirstBlockOfHandler (this ) == GetTarget () );
1318
+ return GetTarget () ;
1314
1319
1315
1320
case BBJ_EHFINALLYRET:
1316
1321
assert (bbEhfTargets != nullptr );
@@ -1322,18 +1327,18 @@ BasicBlock* BasicBlock::GetSucc(unsigned i, Compiler* comp)
1322
1327
case BBJ_ALWAYS:
1323
1328
case BBJ_EHCATCHRET:
1324
1329
case BBJ_LEAVE:
1325
- return bbTarget ;
1330
+ return GetTarget () ;
1326
1331
1327
1332
case BBJ_COND:
1328
1333
if (i == 0 )
1329
1334
{
1330
- return bbFalseTarget ;
1335
+ return GetFalseTarget () ;
1331
1336
}
1332
1337
else
1333
1338
{
1334
1339
assert (i == 1 );
1335
- assert (bbFalseTarget != bbTrueTarget );
1336
- return bbTrueTarget ;
1340
+ assert (bbTrueEdge != bbFalseEdge );
1341
+ return GetTrueTarget () ;
1337
1342
}
1338
1343
1339
1344
case BBJ_SWITCH:
@@ -1585,15 +1590,10 @@ BasicBlock* BasicBlock::New(Compiler* compiler)
1585
1590
return block;
1586
1591
}
1587
1592
1588
- BasicBlock* BasicBlock::New (Compiler* compiler, BBKinds kind, BasicBlock* target /* = nullptr */ )
1593
+ BasicBlock* BasicBlock::New (Compiler* compiler, BBKinds kind)
1589
1594
{
1590
1595
BasicBlock* block = BasicBlock::New (compiler);
1591
-
1592
- // In some cases, we don't know a block's jump target during initialization, so don't check the jump kind/target
1593
- // yet.
1594
- // The checks will be done any time the jump kind/target is read or written to after initialization.
1595
- block->bbKind = kind;
1596
- block->bbTarget = target;
1596
+ block->bbKind = kind;
1597
1597
1598
1598
if (block->KindIs (BBJ_THROW))
1599
1599
{
0 commit comments