File tree Expand file tree Collapse file tree 2 files changed +30
-28
lines changed Expand file tree Collapse file tree 2 files changed +30
-28
lines changed Original file line number Diff line number Diff line change @@ -1529,6 +1529,30 @@ void CodeGen::genExitCode(BasicBlock* block)
1529
1529
GetEmitter ()->emitDisableGC ();
1530
1530
#endif
1531
1531
genEmitGSCookieCheck (jmpEpilog);
1532
+ #ifndef JIT32_GCENCODER
1533
+ if (jmpEpilog)
1534
+ {
1535
+ // Dev10 642944 -
1536
+ // The GS cookie check created a temp label that has no live
1537
+ // incoming GC registers, we need to fix that
1538
+
1539
+ unsigned varNum;
1540
+ LclVarDsc* varDsc;
1541
+
1542
+ /* Figure out which register parameters hold pointers */
1543
+
1544
+ for (varNum = 0 , varDsc = compiler->lvaTable ; varNum < compiler->lvaCount && varDsc->lvIsRegArg ;
1545
+ varNum++, varDsc++)
1546
+ {
1547
+ noway_assert (varDsc->lvIsParam );
1548
+
1549
+ gcInfo.gcMarkRegPtrVal (varDsc->GetArgReg (), varDsc->TypeGet ());
1550
+ }
1551
+
1552
+ GetEmitter ()->emitThisGCrefRegs = GetEmitter ()->emitInitGCrefRegs = gcInfo.gcRegGCrefSetCur ;
1553
+ GetEmitter ()->emitThisByrefRegs = GetEmitter ()->emitInitByrefRegs = gcInfo.gcRegByrefSetCur ;
1554
+ }
1555
+ #endif
1532
1556
}
1533
1557
1534
1558
genReserveEpilog (block);
Original file line number Diff line number Diff line change @@ -113,38 +113,16 @@ void CodeGen::genEmitGSCookieCheck(bool pushReg)
113
113
}
114
114
else
115
115
{
116
- if (compiler->info .compRetNativeType == TYP_REF)
117
- {
118
- gcInfo.gcRegGCrefSetCur |= RBM_INTRET;
119
- }
120
- else if (compiler->info .compRetNativeType == TYP_BYREF)
116
+ ReturnTypeDesc retTypeDesc = compiler->compRetTypeDesc ;
117
+ const unsigned regCount = retTypeDesc.GetReturnRegCount ();
118
+
119
+ for (unsigned i = 0 ; i < regCount; ++i)
121
120
{
122
- gcInfo.gcRegByrefSetCur |= RBM_INTRET;
121
+ gcInfo.gcMarkRegPtrVal (retTypeDesc.GetABIReturnReg (i, compiler->info .compCallConv ),
122
+ retTypeDesc.GetReturnRegType (i));
123
123
}
124
124
}
125
125
}
126
- else
127
- {
128
- // Dev10 642944 -
129
- // The GS cookie check created a temp label that has no live
130
- // incoming GC registers, we need to fix that
131
-
132
- unsigned varNum;
133
- LclVarDsc* varDsc;
134
-
135
- /* Figure out which register parameters hold pointers */
136
-
137
- for (varNum = 0 , varDsc = compiler->lvaTable ; varNum < compiler->lvaCount && varDsc->lvIsRegArg ;
138
- varNum++, varDsc++)
139
- {
140
- noway_assert (varDsc->lvIsParam );
141
-
142
- gcInfo.gcMarkRegPtrVal (varDsc->GetArgReg (), varDsc->TypeGet ());
143
- }
144
-
145
- GetEmitter ()->emitThisGCrefRegs = GetEmitter ()->emitInitGCrefRegs = gcInfo.gcRegGCrefSetCur ;
146
- GetEmitter ()->emitThisByrefRegs = GetEmitter ()->emitInitByrefRegs = gcInfo.gcRegByrefSetCur ;
147
- }
148
126
#else
149
127
assert (GetEmitter ()->emitGCDisabled ());
150
128
#endif
You can’t perform that action at this time.
0 commit comments