summaryrefslogtreecommitdiff
path: root/src/vm/precode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/precode.cpp')
-rw-r--r--src/vm/precode.cpp71
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