diff options
Diffstat (limited to 'src/vm/precode.cpp')
-rw-r--r-- | src/vm/precode.cpp | 71 |
1 files changed, 62 insertions, 9 deletions
diff --git a/src/vm/precode.cpp b/src/vm/precode.cpp index 5ab4ca8637..1909773cff 100644 --- a/src/vm/precode.cpp +++ b/src/vm/precode.cpp @@ -29,6 +29,9 @@ BOOL Precode::IsValidType(PrecodeType t) switch (t) { case PRECODE_STUB: +#ifdef HAS_RELATIVE_STUB_PRECODE + case PRECODE_RELATIVE_STUB: +#endif // HAS_RELATIVE_STUB_PRECODE #ifdef HAS_NDIRECT_IMPORT_PRECODE case PRECODE_NDIRECT_IMPORT: #endif // HAS_NDIRECT_IMPORT_PRECODE @@ -56,6 +59,10 @@ SIZE_T Precode::SizeOf(PrecodeType t) { case PRECODE_STUB: return sizeof(StubPrecode); +#ifdef HAS_RELATIVE_STUB_PRECODE + case PRECODE_RELATIVE_STUB: + return sizeof(RelativeStubPrecode); +#endif // HAS_RELATIVE_STUB_PRECODE #ifdef HAS_NDIRECT_IMPORT_PRECODE case PRECODE_NDIRECT_IMPORT: return sizeof(NDirectImportPrecode); @@ -94,6 +101,11 @@ PCODE Precode::GetTarget() case PRECODE_STUB: target = AsStubPrecode()->GetTarget(); break; +#ifdef HAS_RELATIVE_STUB_PRECODE + case PRECODE_RELATIVE_STUB: + target = AsRelativeStubPrecode()->GetTarget(); + break; +#endif // HAS_RELATIVE_STUB_PRECODE #ifdef HAS_FIXUP_PRECODE case PRECODE_FIXUP: target = AsFixupPrecode()->GetTarget(); @@ -133,6 +145,11 @@ MethodDesc* Precode::GetMethodDesc(BOOL fSpeculative /*= FALSE*/) case PRECODE_STUB: pMD = AsStubPrecode()->GetMethodDesc(); break; +#ifdef HAS_RELATIVE_STUB_PRECODE + case PRECODE_RELATIVE_STUB: + pMD = AsRelativeStubPrecode()->GetMethodDesc(); + break; +#endif // HAS_RELATIVE_STUB_PRECODE #ifdef HAS_NDIRECT_IMPORT_PRECODE case PRECODE_NDIRECT_IMPORT: pMD = AsNDirectImportPrecode()->GetMethodDesc(); @@ -166,13 +183,6 @@ MethodDesc* Precode::GetMethodDesc(BOOL fSpeculative /*= FALSE*/) UnexpectedPrecodeType("Precode::GetMethodDesc", precodeType); } -#ifdef HAS_RELATIVE_FIXUP_PRECODE - if (precodeType == PRECODE_RELATIVE_FIXUP) - { - _ASSERTE(dac_cast<PTR_MethodDesc>(pMD)->IsZapped()); - } -#endif // HAS_RELATIVE_FIXUP_PRECODE - // GetMethodDesc() on platform specific precode types returns TADDR. It should return // PTR_MethodDesc instead. It is a workaround to resolve cyclic dependency between headers. // Once we headers factoring of headers cleaned up, we should be able to get rid of it. @@ -322,6 +332,10 @@ Precode* Precode::GetPrecodeForTemporaryEntryPoint(TADDR temporaryEntryPoints, i _ASSERTE(t != PRECODE_RELATIVE_FIXUP); #endif +#ifdef HAS_RELATIVE_STUB_PRECODE + _ASSERTE(t != PRECODE_RELATIVE_STUB); +#endif + SIZE_T oneSize = SizeOfTemporaryEntryPoint(t); return PTR_Precode(temporaryEntryPoints + index * oneSize); } @@ -361,6 +375,10 @@ SIZE_T Precode::SizeOfTemporaryEntryPoints(PrecodeType t, bool preallocateJumpSt _ASSERTE(t != PRECODE_RELATIVE_FIXUP); #endif +#ifdef HAS_RELATIVE_STUB_PRECODE + _ASSERTE(t != PRECODE_RELATIVE_STUB); +#endif + SIZE_T oneSize = SizeOfTemporaryEntryPoint(t); return count * oneSize; } @@ -401,6 +419,10 @@ Precode* Precode::Allocate(PrecodeType t, MethodDesc* pMD, _ASSERTE(t != PRECODE_RELATIVE_FIXUP); #endif +#ifdef HAS_RELATIVE_STUB_PRECODE + _ASSERTE(t != PRECODE_RELATIVE_STUB); +#endif + #ifdef HAS_FIXUP_PRECODE_CHUNKS if (t == PRECODE_FIXUP) { @@ -430,6 +452,11 @@ void Precode::Init(PrecodeType t, MethodDesc* pMD, LoaderAllocator *pLoaderAlloc case PRECODE_STUB: ((StubPrecode*)this)->Init(pMD, pLoaderAllocator); break; +#ifdef HAS_RELATIVE_STUB_PRECODE + case PRECODE_RELATIVE_STUB: + ((RelativeStubPrecode*)this)->Init(pMD, pLoaderAllocator); + break; +#endif // HAS_RELATIVE_STUB_PRECODE #ifdef HAS_NDIRECT_IMPORT_PRECODE case PRECODE_NDIRECT_IMPORT: ((NDirectImportPrecode*)this)->Init(pMD, pLoaderAllocator); @@ -469,6 +496,11 @@ void Precode::ResetTargetInterlocked() AsStubPrecode()->ResetTargetInterlocked(); break; +#ifdef HAS_RELATIVE_STUB_PRECODE + case PRECODE_RELATIVE_STUB: + AsRelativeStubPrecode()->ResetTargetInterlocked(); +#endif // HAS_RELATIVE_STUB_PRECODE + #ifdef HAS_FIXUP_PRECODE case PRECODE_FIXUP: AsFixupPrecode()->ResetTargetInterlocked(); @@ -510,6 +542,12 @@ BOOL Precode::SetTargetInterlocked(PCODE target, BOOL fOnlyRedirectFromPrestub) ret = AsStubPrecode()->SetTargetInterlocked(target, expected); break; +#ifdef HAS_RELATIVE_STUB_PRECODE + case PRECODE_RELATIVE_STUB: + ret = AsRelativeStubPrecode()->SetTargetInterlocked(target, expected); + break; +#endif // HAS_RELATIVE_STUB_PRECODE + #ifdef HAS_FIXUP_PRECODE case PRECODE_FIXUP: ret = AsFixupPrecode()->SetTargetInterlocked(target, expected); @@ -786,9 +824,15 @@ void Precode::Fixup(DataImage *image, MethodDesc * pMD) } switch (precodeType) { +#ifdef HAS_RELATIVE_STUB_PRECODE + case PRECODE_RELATIVE_STUB: + AsRelativeStubPrecode()->Fixup(image); + break; +#else // HAS_RELATIVE_STUB_PRECODE case PRECODE_STUB: AsStubPrecode()->Fixup(image); break; +#endif // HAS_RELATIVE_STUB_PRECODE #ifdef HAS_NDIRECT_IMPORT_PRECODE case PRECODE_NDIRECT_IMPORT: AsNDirectImportPrecode()->Fixup(image); @@ -837,9 +881,18 @@ void Precode::SaveChunk::Save(DataImage* image, MethodDesc * pMD) _ASSERTE(precodeType != PRECODE_RELATIVE_FIXUP); #endif // HAS_RELATIVE_FIXUP_PRECODE - SIZE_T size = Precode::SizeOf(precodeType); + PrecodeType savedPrecodeType = precodeType; + +#ifdef HAS_RELATIVE_STUB_PRECODE + if (precodeType == PRECODE_STUB) + { + savedPrecodeType = PRECODE_RELATIVE_STUB; + } +#endif // HAS_RELATIVE_STUB_PRECODE + + SIZE_T size = Precode::SizeOf(savedPrecodeType); Precode* pPrecode = (Precode *)new (image->GetHeap()) BYTE[size]; - pPrecode->Init(precodeType, pMD, NULL); + pPrecode->Init(savedPrecodeType, pMD, NULL); pPrecode->Save(image); // Alias the temporary entrypoint |