Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Forbid inlining of pinvoke methods in MulticoreJit thread
NDirect methods can be inlined in other methods during jitting (see `impCheckForPInvokeCall`).
If this happens in mcj thread, it results in NDirect methods being loaded.
This should not happen in mcj thread, because user can set custom native library search callbacks.
In order to fix this, explicit flag JIT_FLAG_NO_PINVOKE_INLINE is set in mcj.
  • Loading branch information
gbalykov committed Aug 1, 2021
commit 3d6381b896bd5f3cd702fd84d2e0dbdcae0af2c9
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ std::string SpmiDumpHelper::DumpJitFlags(unsigned long long flags)
AddFlag(READYTORUN);
AddFlag(PROF_ENTERLEAVE);

AddFlag(PROF_NO_PINVOKE_INLINE);
AddFlag(NO_PINVOKE_INLINE);
AddFlag(SKIP_VERIFICATION);
AddFlag(PREJIT);
AddFlag(RELOC);
Expand Down Expand Up @@ -300,4 +300,3 @@ std::string SpmiDumpHelper::DumpJitFlags(unsigned long long flags)

return s;
}

2 changes: 1 addition & 1 deletion src/coreclr/inc/corjitflags.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ class CORJIT_FLAGS
CORJIT_FLAG_READYTORUN = 19, // Use version-resilient code generation
CORJIT_FLAG_PROF_ENTERLEAVE = 20, // Instrument prologues/epilogues
CORJIT_FLAG_UNUSED11 = 21,
CORJIT_FLAG_PROF_NO_PINVOKE_INLINE = 22, // Disables PInvoke inlining
CORJIT_FLAG_NO_PINVOKE_INLINE = 22, // Disables PInvoke inlining
CORJIT_FLAG_SKIP_VERIFICATION = 23, // (lazy) skip verification - determined without doing a full resolve. See comment below
CORJIT_FLAG_PREJIT = 24, // jit or prejit is the execution engine.
CORJIT_FLAG_RELOC = 25, // Generate relocatable code
Expand Down
8 changes: 2 additions & 6 deletions src/coreclr/jit/compiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1398,10 +1398,6 @@ LONG Compiler::s_compMethodsCount = 0; // to produce unique label names
bool Compiler::s_dspMemStats = false;
#endif

#ifndef PROFILING_SUPPORTED
const bool Compiler::Options::compNoPInvokeInlineCB = false;
#endif

/*****************************************************************************
*
* One time initialization code
Expand Down Expand Up @@ -3251,9 +3247,9 @@ void Compiler::compInitOptions(JitFlags* jitFlags)
s_dspMemStats = (JitConfig.DisplayMemStats() != 0);
#endif

#ifdef PROFILING_SUPPORTED
opts.compNoPInvokeInlineCB = jitFlags->IsSet(JitFlags::JIT_FLAG_PROF_NO_PINVOKE_INLINE);
opts.compNoPInvokeInline = jitFlags->IsSet(JitFlags::JIT_FLAG_NO_PINVOKE_INLINE);

#ifdef PROFILING_SUPPORTED
// Cache the profiler handle
if (jitFlags->IsSet(JitFlags::JIT_FLAG_PROF_ENTERLEAVE))
{
Expand Down
6 changes: 1 addition & 5 deletions src/coreclr/jit/compiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -9347,11 +9347,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
bool compDbgInfo; // Gather debugging info?
bool compDbgEnC;

#ifdef PROFILING_SUPPORTED
bool compNoPInvokeInlineCB;
#else
static const bool compNoPInvokeInlineCB;
#endif
bool compNoPInvokeInline;

#ifdef DEBUG
bool compGcChecks; // Check arguments and return values to ensure they are sane
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/jit/importer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7147,7 +7147,7 @@ GenTree* Compiler::impTransformThis(GenTree* thisPtr,
bool Compiler::impCanPInvokeInline()
{
return getInlinePInvokeEnabled() && (!opts.compDbgCode) && (compCodeOpt() != SMALL_CODE) &&
(!opts.compNoPInvokeInlineCB) // profiler is preventing inline pinvoke
(!opts.compNoPInvokeInline) // JIT flag is preventing inline pinvoke
;
}

Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/jit/jitee.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ class JitFlags
JIT_FLAG_READYTORUN = 19, // Use version-resilient code generation
JIT_FLAG_PROF_ENTERLEAVE = 20, // Instrument prologues/epilogues
JIT_FLAG_UNUSED11 = 21,
JIT_FLAG_PROF_NO_PINVOKE_INLINE = 22, // Disables PInvoke inlining
JIT_FLAG_NO_PINVOKE_INLINE = 22, // Disables PInvoke inlining
JIT_FLAG_SKIP_VERIFICATION = 23, // (lazy) skip verification - determined without doing a full resolve. See comment below
JIT_FLAG_PREJIT = 24, // jit or prejit is the execution engine.
JIT_FLAG_RELOC = 25, // Generate relocatable code
Expand Down Expand Up @@ -196,7 +196,7 @@ class JitFlags
FLAGS_EQUAL(CORJIT_FLAGS::CORJIT_FLAG_MAKEFINALCODE, JIT_FLAG_MAKEFINALCODE);
FLAGS_EQUAL(CORJIT_FLAGS::CORJIT_FLAG_READYTORUN, JIT_FLAG_READYTORUN);
FLAGS_EQUAL(CORJIT_FLAGS::CORJIT_FLAG_PROF_ENTERLEAVE, JIT_FLAG_PROF_ENTERLEAVE);
FLAGS_EQUAL(CORJIT_FLAGS::CORJIT_FLAG_PROF_NO_PINVOKE_INLINE, JIT_FLAG_PROF_NO_PINVOKE_INLINE);
FLAGS_EQUAL(CORJIT_FLAGS::CORJIT_FLAG_NO_PINVOKE_INLINE, JIT_FLAG_NO_PINVOKE_INLINE);
FLAGS_EQUAL(CORJIT_FLAGS::CORJIT_FLAG_SKIP_VERIFICATION, JIT_FLAG_SKIP_VERIFICATION);
FLAGS_EQUAL(CORJIT_FLAGS::CORJIT_FLAG_PREJIT, JIT_FLAG_PREJIT);
FLAGS_EQUAL(CORJIT_FLAGS::CORJIT_FLAG_RELOC, JIT_FLAG_RELOC);
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1366,7 +1366,7 @@ public enum CorJitFlag : uint
CORJIT_FLAG_READYTORUN = 19, // Use version-resilient code generation
CORJIT_FLAG_PROF_ENTERLEAVE = 20, // Instrument prologues/epilogues
CORJIT_FLAG_UNUSED7 = 21,
CORJIT_FLAG_PROF_NO_PINVOKE_INLINE = 22, // Disables PInvoke inlining
CORJIT_FLAG_NO_PINVOKE_INLINE = 22, // Disables PInvoke inlining
CORJIT_FLAG_SKIP_VERIFICATION = 23, // (lazy) skip verification - determined without doing a full resolve. See comment below
CORJIT_FLAG_PREJIT = 24, // jit or prejit is the execution engine.
CORJIT_FLAG_RELOC = 25, // Generate relocatable code
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/vm/jitinterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12931,7 +12931,7 @@ CORJIT_FLAGS GetCompileFlags(MethodDesc * ftn, CORJIT_FLAGS flags, CORINFO_METHO
flags.Set(CORJIT_FLAGS::CORJIT_FLAG_PROF_ENTERLEAVE);

if (CORProfilerTrackTransitions())
flags.Set(CORJIT_FLAGS::CORJIT_FLAG_PROF_NO_PINVOKE_INLINE);
flags.Set(CORJIT_FLAGS::CORJIT_FLAG_NO_PINVOKE_INLINE);
#endif // PROFILING_SUPPORTED

// Set optimization flags
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/vm/method.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2318,6 +2318,8 @@ class MulticoreJitPrepareCodeConfig : public PrepareCodeConfig
m_wasTier0 = true;
}

virtual CORJIT_FLAGS GetJitCompilationFlags() override;

virtual BOOL SetNativeCode(PCODE pCode, PCODE * ppAlternateCodeToUse) override;
};
#endif // DACCESS_COMPILE
Expand Down
9 changes: 9 additions & 0 deletions src/coreclr/vm/multicorejitplayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -531,6 +531,15 @@ BOOL MulticoreJitPrepareCodeConfig::SetNativeCode(PCODE pCode, PCODE * ppAlterna
return TRUE;
}

CORJIT_FLAGS MulticoreJitPrepareCodeConfig::GetJitCompilationFlags()
{
STANDARD_VM_CONTRACT;

CORJIT_FLAGS flags = PrepareCodeConfig::GetJitCompilationFlags();
flags.Set(CORJIT_FLAGS::CORJIT_FLAG_NO_PINVOKE_INLINE);
return flags;
}

MulticoreJitCodeInfo::MulticoreJitCodeInfo(PCODE entryPoint, const MulticoreJitPrepareCodeConfig *pConfig)
{
WRAPPER_NO_CONTRACT;
Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/zap/zapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1130,7 +1130,7 @@ void Zapper::InitializeCompilerFlags(CORCOMPILE_VERSION_INFO * pVersionInfo)
m_pOpt->m_compilerFlags.Clear(CORJIT_FLAGS::CORJIT_FLAG_DEBUG_INFO);
m_pOpt->m_compilerFlags.Clear(CORJIT_FLAGS::CORJIT_FLAG_DEBUG_CODE);
m_pOpt->m_compilerFlags.Clear(CORJIT_FLAGS::CORJIT_FLAG_PROF_ENTERLEAVE);
m_pOpt->m_compilerFlags.Clear(CORJIT_FLAGS::CORJIT_FLAG_PROF_NO_PINVOKE_INLINE);
m_pOpt->m_compilerFlags.Clear(CORJIT_FLAGS::CORJIT_FLAG_NO_PINVOKE_INLINE);

// We track debug info all the time in the ngen image
m_pOpt->m_compilerFlags.Set(CORJIT_FLAGS::CORJIT_FLAG_DEBUG_INFO);
Expand All @@ -1144,7 +1144,7 @@ void Zapper::InitializeCompilerFlags(CORCOMPILE_VERSION_INFO * pVersionInfo)
if (pVersionInfo->wCodegenFlags & CORCOMPILE_CODEGEN_PROFILING)
{
m_pOpt->m_compilerFlags.Set(CORJIT_FLAGS::CORJIT_FLAG_PROF_ENTERLEAVE);
m_pOpt->m_compilerFlags.Set(CORJIT_FLAGS::CORJIT_FLAG_PROF_NO_PINVOKE_INLINE);
m_pOpt->m_compilerFlags.Set(CORJIT_FLAGS::CORJIT_FLAG_NO_PINVOKE_INLINE);
m_pOpt->m_ngenProfileImage = true;
}

Expand Down