}
/*********************************************************************/
+void CEEJitInfo::WriteCodeBytes()
+{
+ LIMITED_METHOD_CONTRACT;
+
+#ifdef USE_INDIRECT_CODEHEADER
+ if (m_pRealCodeHeader != NULL)
+ {
+ // Restore the read only version of the real code header
+ m_CodeHeaderRW->SetRealCodeHeader(m_pRealCodeHeader);
+ m_pRealCodeHeader = NULL;
+ }
+#endif // USE_INDIRECT_CODEHEADER
+
+ if (m_CodeHeaderRW != m_CodeHeader)
+ {
+ ExecutableWriterHolder<void> codeWriterHolder((void *)m_CodeHeader, m_codeWriteBufferSize);
+ memcpy(codeWriterHolder.GetRW(), m_CodeHeaderRW, m_codeWriteBufferSize);
+ }
+}
+
+/*********************************************************************/
void CEEJitInfo::BackoutJitData(EEJitManager * jitMgr)
{
CONTRACTL {
GC_TRIGGERS;
} CONTRACTL_END;
+ // The RemoveJitData call below requires the m_CodeHeader to be valid, so we need to write
+ // the code bytes to the target memory location.
+ WriteCodeBytes();
+
CodeHeader* pCodeHeader = m_CodeHeader;
if (pCodeHeader)
jitMgr->RemoveJitData(pCodeHeader, m_GCinfo_len, m_EHinfo_len);
GC_TRIGGERS;
} CONTRACTL_END;
-#ifdef USE_INDIRECT_CODEHEADER
- if (m_pRealCodeHeader != NULL)
- {
- // Restore the read only version of the real code header
- m_CodeHeaderRW->SetRealCodeHeader(m_pRealCodeHeader);
- m_pRealCodeHeader = NULL;
- }
-#endif // USE_INDIRECT_CODEHEADER
-
- if (m_CodeHeaderRW != m_CodeHeader)
- {
- ExecutableWriterHolder<void> codeWriterHolder((void *)m_CodeHeader, m_codeWriteBufferSize);
- memcpy(codeWriterHolder.GetRW(), m_CodeHeaderRW, m_codeWriteBufferSize);
- }
+ WriteCodeBytes();
// Now that the code header was written to the final location, publish the code via the nibble map
jitMgr->NibbleMapSet(m_pCodeHeap, m_CodeHeader->GetCodeStartAddress(), TRUE);