From d0f58db1d3949ba7a9ded99e28c7293b7f23c6ad Mon Sep 17 00:00:00 2001 From: Andy Ayers Date: Wed, 6 Jun 2018 12:37:09 -0700 Subject: [PATCH] JIT: implement assembly name dissassembly filtering (dotnet/coreclr#18306) Add `COMPlus_JitDisasmAssemblies` to specify a whitelist of assemblies whose methods will be disassembled (also filters out order, EH, GC, and unwind info dumps too). Intended use is for PMI asm diffing. Since PMI runs in process, current disassembly will dissassemble various methods in PMI itself as well as framework methods that did not get prejitted. With this new config option we can restrict disassembly to just the assemblies that we're processing via PMI. Commit migrated from https://github.com/dotnet/coreclr/commit/0ec905298e9fa3bdc5500f7f25f65de49d3ede16 --- src/coreclr/src/jit/compiler.cpp | 80 +++++++++++++++++++++++++++-------- src/coreclr/src/jit/compiler.h | 5 +++ src/coreclr/src/jit/jitconfigvalues.h | 10 +++-- 3 files changed, 73 insertions(+), 22 deletions(-) diff --git a/src/coreclr/src/jit/compiler.cpp b/src/coreclr/src/jit/compiler.cpp index 6231da8..a75ad6c 100644 --- a/src/coreclr/src/jit/compiler.cpp +++ b/src/coreclr/src/jit/compiler.cpp @@ -45,6 +45,12 @@ bool Compiler::s_pAltJitExcludeAssembliesListInitialized = false; AssemblyNamesList2* Compiler::s_pAltJitExcludeAssembliesList = nullptr; #endif // ALT_JIT +#ifdef DEBUG +// static +bool Compiler::s_pJitDisasmIncludeAssembliesListInitialized = false; +AssemblyNamesList2* Compiler::s_pJitDisasmIncludeAssembliesList = nullptr; +#endif // DEBUG + /***************************************************************************** * * Little helpers to grab the current cycle counter value; this is done @@ -1386,6 +1392,14 @@ void Compiler::compShutdown() } #endif // ALT_JIT +#ifdef DEBUG + if (s_pJitDisasmIncludeAssembliesList != nullptr) + { + s_pJitDisasmIncludeAssembliesList->~AssemblyNamesList2(); // call the destructor + s_pJitDisasmIncludeAssembliesList = nullptr; + } +#endif // DEBUG + #if MEASURE_NOWAY DisplayNowayAssertMap(); #endif // MEASURE_NOWAY @@ -3390,34 +3404,64 @@ void Compiler::compInitOptions(JitFlags* jitFlags) } else { - if ((JitConfig.JitOrder() & 1) == 1) - { - opts.dspOrder = true; - } + bool disEnabled = true; - if (JitConfig.JitGCDump().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + // Setup assembly name list for disassembly, if not already set up. + if (!s_pJitDisasmIncludeAssembliesListInitialized) { - opts.dspGCtbls = true; + const wchar_t* assemblyNameList = JitConfig.JitDisasmAssemblies(); + if (assemblyNameList != nullptr) + { + s_pJitDisasmIncludeAssembliesList = new (HostAllocator::getHostAllocator()) + AssemblyNamesList2(assemblyNameList, HostAllocator::getHostAllocator()); + } + s_pJitDisasmIncludeAssembliesListInitialized = true; } - if (JitConfig.JitDisasm().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + // If we have an assembly name list for disassembly, also check this method's assembly. + if (s_pJitDisasmIncludeAssembliesList != nullptr) { - opts.disAsm = true; - } + const char* assemblyName = info.compCompHnd->getAssemblyName( + info.compCompHnd->getModuleAssembly(info.compCompHnd->getClassModule(info.compClassHnd))); - if (JitConfig.JitDisasm().contains("SPILLED", nullptr, nullptr)) - { - opts.disAsmSpilled = true; + if (!s_pJitDisasmIncludeAssembliesList->IsInList(assemblyName)) + { + disEnabled = false; + } } - if (JitConfig.JitUnwindDump().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (disEnabled) { - opts.dspUnwind = true; - } + if ((JitConfig.JitOrder() & 1) == 1) + { + opts.dspOrder = true; + } - if (JitConfig.JitEHDump().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) - { - opts.dspEHTable = true; + if (JitConfig.JitGCDump().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + { + opts.dspGCtbls = true; + } + + if (JitConfig.JitDisasm().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + { + opts.disAsm = true; + } + + if (JitConfig.JitDisasm().contains("SPILLED", nullptr, nullptr)) + { + opts.disAsmSpilled = true; + } + + if (JitConfig.JitUnwindDump().contains(info.compMethodName, info.compClassName, + &info.compMethodInfo->args)) + { + opts.dspUnwind = true; + } + + if (JitConfig.JitEHDump().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + { + opts.dspEHTable = true; + } } } diff --git a/src/coreclr/src/jit/compiler.h b/src/coreclr/src/jit/compiler.h index e8c4594..c702aad 100644 --- a/src/coreclr/src/jit/compiler.h +++ b/src/coreclr/src/jit/compiler.h @@ -8003,6 +8003,11 @@ public: #endif // ALT_JIT #ifdef DEBUG + static bool s_pJitDisasmIncludeAssembliesListInitialized; + static AssemblyNamesList2* s_pJitDisasmIncludeAssembliesList; +#endif // DEBUG + +#ifdef DEBUG template T dspPtr(T p) diff --git a/src/coreclr/src/jit/jitconfigvalues.h b/src/coreclr/src/jit/jitconfigvalues.h index 9c20cd3..26c5ccc 100644 --- a/src/coreclr/src/jit/jitconfigvalues.h +++ b/src/coreclr/src/jit/jitconfigvalues.h @@ -141,10 +141,12 @@ CONFIG_INTEGER(TailcallStress, W("TailcallStress"), 0) CONFIG_INTEGER(TreesBeforeAfterMorph, W("JitDumpBeforeAfterMorph"), 0) // If 1, display each tree before/after morphing CONFIG_METHODSET(JitBreak, W("JitBreak")) // Stops in the importer when compiling a specified method CONFIG_METHODSET(JitDebugBreak, W("JitDebugBreak")) -CONFIG_METHODSET(JitDisasm, W("JitDisasm")) // Dumps disassembly for specified method -CONFIG_METHODSET(JitDump, W("JitDump")) // Dumps trees for specified method -CONFIG_METHODSET(JitDumpIR, W("JitDumpIR")) // Dumps trees (in linear IR form) for specified method -CONFIG_METHODSET(JitEHDump, W("JitEHDump")) // Dump the EH table for the method, as reported to the VM +CONFIG_METHODSET(JitDisasm, W("JitDisasm")) // Dumps disassembly for specified method +CONFIG_STRING(JitDisasmAssemblies, W("JitDisasmAssemblies")) // Only show JitDisasm and related info for methods + // from this semicolon-delimited list of assemblies. +CONFIG_METHODSET(JitDump, W("JitDump")) // Dumps trees for specified method +CONFIG_METHODSET(JitDumpIR, W("JitDumpIR")) // Dumps trees (in linear IR form) for specified method +CONFIG_METHODSET(JitEHDump, W("JitEHDump")) // Dump the EH table for the method, as reported to the VM CONFIG_METHODSET(JitExclude, W("JitExclude")) CONFIG_METHODSET(JitForceProcedureSplitting, W("JitForceProcedureSplitting")) CONFIG_METHODSET(JitGCDump, W("JitGCDump")) -- 2.7.4