Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement getClassAssemblyName #106959

Merged
merged 11 commits into from
Sep 8, 2024
Merged
Show file tree
Hide file tree
Changes from 7 commits
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
16 changes: 3 additions & 13 deletions src/coreclr/inc/corinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -934,7 +934,6 @@ struct PatchpointInfo;
// Cookie types consumed by the code generator (these are opaque values
// not inspected by the code generator):

typedef struct CORINFO_ASSEMBLY_STRUCT_* CORINFO_ASSEMBLY_HANDLE;
typedef struct CORINFO_MODULE_STRUCT_* CORINFO_MODULE_HANDLE;
typedef struct CORINFO_DEPENDENCY_STRUCT_* CORINFO_DEPENDENCY_HANDLE;
typedef struct CORINFO_CLASS_STRUCT_* CORINFO_CLASS_HANDLE;
Expand Down Expand Up @@ -2325,18 +2324,9 @@ class ICorStaticInfo
CORINFO_CLASS_HANDLE cls
) = 0;

virtual CORINFO_MODULE_HANDLE getClassModule (
CORINFO_CLASS_HANDLE cls
) = 0;

// Returns the assembly that contains the module "mod".
virtual CORINFO_ASSEMBLY_HANDLE getModuleAssembly (
hez2010 marked this conversation as resolved.
Show resolved Hide resolved
CORINFO_MODULE_HANDLE mod
) = 0;

// Returns the name of the assembly "assem".
virtual const char* getAssemblyName (
CORINFO_ASSEMBLY_HANDLE assem
// Returns the assembly name of the class "cls".
hez2010 marked this conversation as resolved.
Show resolved Hide resolved
virtual const char* getClassAssemblyName (
CORINFO_CLASS_HANDLE cls
) = 0;

// Allocate and delete process-lifetime objects. Should only be
Expand Down
8 changes: 1 addition & 7 deletions src/coreclr/inc/icorjitinfoimpl_generated.h
Original file line number Diff line number Diff line change
Expand Up @@ -193,15 +193,9 @@ bool isValueClass(
uint32_t getClassAttribs(
CORINFO_CLASS_HANDLE cls) override;

CORINFO_MODULE_HANDLE getClassModule(
const char* getClassAssemblyName(
CORINFO_CLASS_HANDLE cls) override;

CORINFO_ASSEMBLY_HANDLE getModuleAssembly(
CORINFO_MODULE_HANDLE mod) override;

const char* getAssemblyName(
CORINFO_ASSEMBLY_HANDLE assem) override;

void* LongLifetimeMalloc(
size_t sz) override;

Expand Down
10 changes: 5 additions & 5 deletions src/coreclr/inc/jiteeversionguid.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,11 @@ typedef const GUID *LPCGUID;
#define GUID_DEFINED
#endif // !GUID_DEFINED

constexpr GUID JITEEVersionIdentifier = { /* 62865a69-7c84-4ba5-8636-a7dec55c05a7 */
0x62865a69,
0x7c84,
0x4ba5,
{0x86, 0x36, 0xa7, 0xde, 0xc5, 0x5c, 0x05, 0xa7}
constexpr GUID JITEEVersionIdentifier = { /* b75a5475-ff22-4078-9551-2024ce03d383 */
0xb75a5475,
0xff22,
0x4078,
{0x95, 0x51, 0x20, 0x24, 0xce, 0x03, 0xd3, 0x83}
};

//////////////////////////////////////////////////////////////////////////////////////////////////////////
Expand Down
4 changes: 1 addition & 3 deletions src/coreclr/jit/ICorJitInfo_names_generated.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,7 @@ DEF_CLR_API(getTypeInstantiationArgument)
DEF_CLR_API(printClassName)
DEF_CLR_API(isValueClass)
DEF_CLR_API(getClassAttribs)
DEF_CLR_API(getClassModule)
DEF_CLR_API(getModuleAssembly)
DEF_CLR_API(getAssemblyName)
DEF_CLR_API(getClassAssemblyName)
DEF_CLR_API(LongLifetimeMalloc)
DEF_CLR_API(LongLifetimeFree)
DEF_CLR_API(getIsClassInitedFlagAddress)
Expand Down
26 changes: 4 additions & 22 deletions src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -416,30 +416,12 @@ uint32_t WrapICorJitInfo::getClassAttribs(
return temp;
}

CORINFO_MODULE_HANDLE WrapICorJitInfo::getClassModule(
const char* WrapICorJitInfo::getClassAssemblyName(
CORINFO_CLASS_HANDLE cls)
{
API_ENTER(getClassModule);
CORINFO_MODULE_HANDLE temp = wrapHnd->getClassModule(cls);
API_LEAVE(getClassModule);
return temp;
}

CORINFO_ASSEMBLY_HANDLE WrapICorJitInfo::getModuleAssembly(
CORINFO_MODULE_HANDLE mod)
{
API_ENTER(getModuleAssembly);
CORINFO_ASSEMBLY_HANDLE temp = wrapHnd->getModuleAssembly(mod);
API_LEAVE(getModuleAssembly);
return temp;
}

const char* WrapICorJitInfo::getAssemblyName(
CORINFO_ASSEMBLY_HANDLE assem)
{
API_ENTER(getAssemblyName);
const char* temp = wrapHnd->getAssemblyName(assem);
API_LEAVE(getAssemblyName);
API_ENTER(getClassAssemblyName);
const char* temp = wrapHnd->getClassAssemblyName(cls);
API_LEAVE(getClassAssemblyName);
return temp;
}

Expand Down
55 changes: 21 additions & 34 deletions src/coreclr/jit/compiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2660,9 +2660,8 @@ void Compiler::compInitOptions(JitFlags* jitFlags)
// We have an exclusion list. See if this method is in an assembly that is on the list.
// Note that we check this for every method, since we might inline across modules, and
// if the inlinee module is on the list, we don't want to use the altjit for it.
const char* methodAssemblyName = info.compCompHnd->getAssemblyName(
info.compCompHnd->getModuleAssembly(info.compCompHnd->getClassModule(info.compClassHnd)));
if (s_pAltJitExcludeAssembliesList->IsInList(methodAssemblyName))
const char* methodAssemblyName = eeGetClassAssemblyName(info.compClassHnd);
if (methodAssemblyName != nullptr && s_pAltJitExcludeAssembliesList->IsInList(methodAssemblyName))
hez2010 marked this conversation as resolved.
Show resolved Hide resolved
{
opts.altJit = false;
}
Expand All @@ -2688,8 +2687,7 @@ void Compiler::compInitOptions(JitFlags* jitFlags)
bool assemblyInIncludeList = true; // assume we'll dump, if there's not an include list (or it's empty).
if (s_pJitDisasmIncludeAssembliesList != nullptr && !s_pJitDisasmIncludeAssembliesList->IsEmpty())
{
const char* assemblyName = info.compCompHnd->getAssemblyName(
info.compCompHnd->getModuleAssembly(info.compCompHnd->getClassModule(info.compClassHnd)));
const char* assemblyName = eeGetClassAssemblyName(info.compClassHnd);
if (!s_pJitDisasmIncludeAssembliesList->IsInList(assemblyName))
{
hez2010 marked this conversation as resolved.
Show resolved Hide resolved
// We have a list, and the current assembly is not in it, so we won't dump.
Expand Down Expand Up @@ -6461,39 +6459,29 @@ int Compiler::compCompile(CORINFO_MODULE_HANDLE classPtr,
#ifdef DEBUG
if (JitConfig.EnableExtraSuperPmiQueries())
{
// This call to getClassModule/getModuleAssembly/getAssemblyName fails in crossgen2 due to these
// APIs being unimplemented. So disable this extra info for pre-jit mode. See
// https://github.com/dotnet/runtime/issues/48888.
//
// Ditto for some of the class name queries for generic params.
//
if (!compileFlags->IsSet(JitFlags::JIT_FLAG_PREJIT))
{
// Get the assembly name, to aid finding any particular SuperPMI method context function
(void)info.compCompHnd->getAssemblyName(
info.compCompHnd->getModuleAssembly(info.compCompHnd->getClassModule(info.compClassHnd)));
// Get the assembly name, to aid finding any particular SuperPMI method context function
(void)eeGetClassAssemblyName(info.compClassHnd);

// Fetch class names for the method's generic parameters.
//
CORINFO_SIG_INFO sig;
info.compCompHnd->getMethodSig(info.compMethodHnd, &sig, nullptr);
// Fetch class names for the method's generic parameters.
//
CORINFO_SIG_INFO sig;
info.compCompHnd->getMethodSig(info.compMethodHnd, &sig, nullptr);

const unsigned classInst = sig.sigInst.classInstCount;
if (classInst > 0)
const unsigned classInst = sig.sigInst.classInstCount;
if (classInst > 0)
{
for (unsigned i = 0; i < classInst; i++)
{
for (unsigned i = 0; i < classInst; i++)
{
eeGetClassName(sig.sigInst.classInst[i]);
}
eeGetClassName(sig.sigInst.classInst[i]);
}
}

const unsigned methodInst = sig.sigInst.methInstCount;
if (methodInst > 0)
const unsigned methodInst = sig.sigInst.methInstCount;
if (methodInst > 0)
{
for (unsigned i = 0; i < methodInst; i++)
{
for (unsigned i = 0; i < methodInst; i++)
{
eeGetClassName(sig.sigInst.methInst[i]);
}
eeGetClassName(sig.sigInst.methInst[i]);
}
}
}
Expand Down Expand Up @@ -9383,8 +9371,7 @@ void JitTimer::PrintCsvMethodStats(Compiler* comp)
}
else
{
const char* methodAssemblyName = comp->info.compCompHnd->getAssemblyName(
comp->info.compCompHnd->getModuleAssembly(comp->info.compCompHnd->getClassModule(comp->info.compClassHnd)));
const char* methodAssemblyName = comp->eeGetClassAssemblyName(comp->info.compClassHnd);
fprintf(s_csvFile, "\"%s\",", methodAssemblyName);
}
fprintf(s_csvFile, "%u,", comp->info.compILCodeSize);
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/jit/compiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -8337,6 +8337,8 @@ class Compiler
void eePrintObjectDescription(const char* prefix, CORINFO_OBJECT_HANDLE handle);
const char* eeGetShortClassName(CORINFO_CLASS_HANDLE clsHnd);

const char* eeGetClassAssemblyName(CORINFO_CLASS_HANDLE clsHnd, char* buffer = nullptr, size_t bufferSize = 0);

#if defined(DEBUG)
unsigned eeTryGetClassSize(CORINFO_CLASS_HANDLE clsHnd);
#endif
Expand Down
23 changes: 23 additions & 0 deletions src/coreclr/jit/eeinterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -596,6 +596,29 @@ const char* Compiler::eeGetShortClassName(CORINFO_CLASS_HANDLE clsHnd)
return printer.GetBuffer();
}

//------------------------------------------------------------------------
// eeGetClassAssemblyName:
// Get the assembly name of a type.
// If missing information (in SPMI), then return a placeholder string.
//
// Parameters:
// clsHnd - the handle of the class
// buffer - a buffer to use for scratch space, or null pointer to allocate a new string.
hez2010 marked this conversation as resolved.
Show resolved Hide resolved
// bufferSize - the size of buffer. If the final class name is longer a new string will be allocated.
//
// Return value:
// The name string.
//
const char* Compiler::eeGetClassAssemblyName(CORINFO_CLASS_HANDLE clsHnd, char* buffer, size_t bufferSize)
{
const char* assemblyName = "<unknown assembly>";
eeRunFunctorWithSPMIErrorTrap([&]() {
assemblyName = info.compCompHnd->getClassAssemblyName(clsHnd);
});

return assemblyName != nullptr ? assemblyName : "<no assembly>";
}

void Compiler::eePrintObjectDescription(const char* prefix, CORINFO_OBJECT_HANDLE handle)
{
const size_t maxStrSize = 64;
Expand Down
17 changes: 11 additions & 6 deletions src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2092,12 +2092,17 @@ private uint getClassAttribsInternal(TypeDesc type)
return (uint)result;
}

private CORINFO_MODULE_STRUCT_* getClassModule(CORINFO_CLASS_STRUCT_* cls)
{ throw new NotImplementedException("getClassModule"); }
private CORINFO_ASSEMBLY_STRUCT_* getModuleAssembly(CORINFO_MODULE_STRUCT_* mod)
{ throw new NotImplementedException("getModuleAssembly"); }
private byte* getAssemblyName(CORINFO_ASSEMBLY_STRUCT_* assem)
{ throw new NotImplementedException("getAssemblyName"); }
private byte* getClassAssemblyName(CORINFO_CLASS_STRUCT_* cls)
{
TypeDesc type = HandleToObject(cls);

if (type is MetadataType mdType)
{
return (byte*)GetPin(StringToUTF8(mdType.Module.Assembly.GetName().Name));
}

return null;
}

#pragma warning disable CA1822 // Mark members as static
private void* LongLifetimeMalloc(UIntPtr sz)
Expand Down
Loading
Loading