BYTE nextByte = *table++;
BYTE encoding = nextByte & 0x7f;
- const BYTE maskHaveMoreBytesBit = MORE_BYTES_TO_FOLLOW - 1;
GetInfoHdr(encoding, header);
while (nextByte & MORE_BYTES_TO_FOLLOW)
{
nextByte = *table++;
- encoding = nextByte & maskHaveMoreBytesBit;
+ encoding = nextByte & ADJ_ENCODING_MAX;
// encoding here always corresponds to codes in InfoHdrAdjust set
if (encoding < NEXT_FOUR_START)
case NEXT_OPCODE:
_ASSERTE((nextByte & MORE_BYTES_TO_FOLLOW) && "Must have another code");
nextByte = *table++;
- encoding = nextByte & maskHaveMoreBytesBit;
+ encoding = nextByte & ADJ_ENCODING_MAX;
// encoding here always corresponds to codes in InfoHdrAdjust2 set
if (encoding < SET_RET_KIND_MAX)
SET_EPILOGCNT_MAX = 4,
SET_UNTRACKED_MAX = 3,
SET_RET_KIND_MAX = 4, // 2 bits for ReturnKind
+ ADJ_ENCODING_MAX = 0x7f, // Maximum valid encoding in a byte
+ // Also used to mask off next bit from each encoding byte.
MORE_BYTES_TO_FOLLOW = 0x80 // If the High-bit of a header or adjustment byte
// is set, then there are more adjustments to follow.
};
goto DO_RETURN;
}
- if (state->returnKind != header.returnKind)
+ if (GCInfoEncodesReturnKind() && (state->returnKind != header.returnKind))
{
- _ASSERTE(GCInfoEncodesReturnKind());
state->returnKind = header.returnKind;
codeSet = 2; // Two byte encoding
encoding = header.returnKind;
}
}
- if (state->revPInvokeOffset != header.revPInvokeOffset)
+ if (GCInfoEncodesRevPInvokeFrame() && (state->revPInvokeOffset != header.revPInvokeOffset))
{
- _ASSERTE(GCInfoEncodesRevPInvokeFrame());
assert(state->revPInvokeOffset == INVALID_REV_PINVOKE_OFFSET || state->revPInvokeOffset == HAS_REV_PINVOKE_FRAME_OFFSET);
if (state->revPInvokeOffset == INVALID_REV_PINVOKE_OFFSET)
header->genericsContext = compiler->lvaReportParamTypeArg();
header->genericsContextIsMethodDesc =
header->genericsContext && (compiler->info.compMethodInfo->options & (CORINFO_GENERICS_CTXT_FROM_METHODDESC));
- header->gsCookieOffset = INVALID_GS_COOKIE_OFFSET;
- ReturnKind returnKind = getReturnKind();
- _ASSERTE(IsValidReturnKind(returnKind) && "Return Kind must be valid");
- _ASSERTE(!IsStructReturnKind(returnKind) && "Struct Return Kinds Unexpected for JIT32");
- header->returnKind = returnKind;
+ if (GCInfoEncodesReturnKind())
+ {
+ ReturnKind returnKind = getReturnKind();
+ _ASSERTE(IsValidReturnKind(returnKind) && "Return Kind must be valid");
+ _ASSERTE(!IsStructReturnKind(returnKind) && "Struct Return Kinds Unexpected for JIT32");
+ _ASSERTE((returnKind < SET_RET_KIND_MAX) && "ReturnKind has no legal encoding");
+ header->returnKind = returnKind;
+ }
+ header->gsCookieOffset = INVALID_GS_COOKIE_OFFSET;
if (compiler->getNeedsGSSecurityCookie())
{
assert(compiler->lvaGSSecurityCookie != BAD_VAR_NUM);
// synchronized methods can't have more than 1 epilog
assert(header->epilogCount <= 1);
}
+
header->revPInvokeOffset = INVALID_REV_PINVOKE_OFFSET;
assert((compiler->compArgSize & 0x3) == 0);