Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
1 change: 1 addition & 0 deletions src/coreclr/inc/corinfo.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -1634,6 +1634,7 @@ enum CORINFO_DEVIRTUALIZATION_DETAIL
CORINFO_DEVIRTUALIZATION_FAILED_BUBBLE_IMPL_NOT_REFERENCEABLE, // object class cannot be referenced from R2R code due to missing tokens
CORINFO_DEVIRTUALIZATION_FAILED_DUPLICATE_INTERFACE, // crossgen2 virtual method algorithm and runtime algorithm differ in the presence of duplicate interface implementations
CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE, // Decl method cannot be represented in R2R image
CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE, // Support for type equivalence in devirtualization is not yet implemented in crossgen2
CORINFO_DEVIRTUALIZATION_COUNT, // sentinel for maximum value
};

Expand Down
12 changes: 6 additions & 6 deletions src/coreclr/inc/jiteeversionguid.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,13 +43,13 @@ typedef const GUID *LPCGUID;
#define GUID_DEFINED
#endif // !GUID_DEFINED

constexpr GUID JITEEVersionIdentifier = { /* 2335da47-1d6c-4844-96b6-025558a525ba */
0x2335da47,
0x1d6c,
0x4844,
{0x96, 0xb6, 0x02, 0x55, 0x58, 0xa5, 0x25, 0xba}
constexpr GUID JITEEVersionIdentifier = { /* ba2c087c-9b8b-49c1-a52f-3514eb489308 */
0xba2c087c,
0x9b8b,
0x49c1,
{0xa5, 0x2f, 0x35, 0x14, 0xeb, 0x48, 0x93, 0x08}
};

//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// END JITEEVersionIdentifier
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/jit/compiler.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -10353,6 +10353,8 @@ const char* Compiler::devirtualizationDetailToString(CORINFO_DEVIRTUALIZATION_DE
"interface implementations";
case CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE:
return "Decl method cannot be represented in R2R image";
case CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE:
return "Support for type equivalence in devirtualization is not yet implemented in crossgen2";
default:
return "undefined";
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -45,6 +45,14 @@ private sealed class ValidTypeHashTable : LockFreeReaderHashtable<TypeDesc, Type

private static TypeDesc EnsureLoadableTypeUncached(TypeDesc type)
{
if (type.TypeIdentifierData != null)
{
if (!type.TypeHasCharacteristicsRequiredToBeLoadableTypeEquivalentType)
{
ThrowHelper.ThrowTypeLoadException(ExceptionStringID.ClassLoadGeneral, type);
}
}

if (type.IsParameterizedType)
{
// Validate parameterized types
Expand Down
8 changes: 6 additions & 2 deletions src/coreclr/tools/Common/Compiler/TypeExtensions.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -322,7 +322,7 @@ public static TypeDesc MergeTypesToCommonParent(TypeDesc ta, TypeDesc tb)
bDepth--;
}

while (ta != tb)
while (!ta.IsEquivalentTo(tb))
{
ta = ta.BaseType;
tb = tb.BaseType;
Expand DownExpand Up@@ -350,7 +350,11 @@ private static TypeDesc MergeArrayTypesToCommonParent(ArrayType ta, ArrayType tb
Debug.Assert(taElem != tbElem);

TypeDesc mergeElem;
if (taElem.IsArray && tbElem.IsArray)
if (taElem.IsEquivalentTo(tbElem))
{
mergeElem = taElem;
}
else if (taElem.IsArray && tbElem.IsArray)
{
mergeElem = MergeArrayTypesToCommonParent((ArrayType)taElem, (ArrayType)tbElem);
}
Expand Down
7 changes: 7 additions & 0 deletions src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -857,6 +857,10 @@ private void Get_CORINFO_SIG_INFO(MethodSignature signature, CORINFO_SIG_INFO* s
sig->_retType = (byte)corInfoRetType;
sig->retTypeSigClass = ObjectToHandle(signature.ReturnType);

#if READYTORUN
ValidateSafetyOfUsingTypeEquivalenceOfType(signature.ReturnType);
#endif

sig->flags = 0; // used by IL stubs code

sig->numArgs = (ushort)signature.Length;
Expand DownExpand Up@@ -1756,6 +1760,7 @@ private void resolveToken(ref CORINFO_RESOLVED_TOKEN pResolvedToken)
ModuleToken methodModuleToken = HandleToModuleToken(ref pResolvedToken);
var resolver = _compilation.NodeFactory.Resolver;
resolver.AddModuleTokenForMethod(method, methodModuleToken);
ValidateSafetyOfUsingTypeEquivalenceInSignature(method.Signature);
}
#else
_compilation.NodeFactory.MetadataManager.GetDependenciesDueToAccess(ref _additionalDependencies, _compilation.NodeFactory, (MethodIL)methodIL, method);
Expand All@@ -1782,6 +1787,8 @@ private void resolveToken(ref CORINFO_RESOLVED_TOKEN pResolvedToken)

#if !READYTORUN
_compilation.NodeFactory.MetadataManager.GetDependenciesDueToAccess(ref _additionalDependencies, _compilation.NodeFactory, (MethodIL)methodIL, field);
#else
ValidateSafetyOfUsingTypeEquivalenceOfType(field.FieldType);
#endif
}
else
Expand Down
1 change: 1 addition & 0 deletions src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -1058,6 +1058,7 @@ public enum CORINFO_DEVIRTUALIZATION_DETAIL
CORINFO_DEVIRTUALIZATION_FAILED_BUBBLE_IMPL_NOT_REFERENCEABLE, // object class cannot be referenced from R2R code due to missing tokens
CORINFO_DEVIRTUALIZATION_FAILED_DUPLICATE_INTERFACE, // crossgen2 virtual method algorithm and runtime algorithm differ in the presence of duplicate interface implementations
CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE, // Decl method cannot be represented in R2R image
CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE, // Support for type equivalence in devirtualization is not yet implemented in crossgen2
CORINFO_DEVIRTUALIZATION_COUNT, // sentinel for maximum value
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Type equivalence support in Crossgen2 by davidwrighton · Pull Request #87899 · dotnet/runtime · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
1 change: 1 addition & 0 deletions src/coreclr/inc/corinfo.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -1634,6 +1634,7 @@ enum CORINFO_DEVIRTUALIZATION_DETAIL
CORINFO_DEVIRTUALIZATION_FAILED_BUBBLE_IMPL_NOT_REFERENCEABLE, // object class cannot be referenced from R2R code due to missing tokens
CORINFO_DEVIRTUALIZATION_FAILED_DUPLICATE_INTERFACE, // crossgen2 virtual method algorithm and runtime algorithm differ in the presence of duplicate interface implementations
CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE, // Decl method cannot be represented in R2R image
CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE, // Support for type equivalence in devirtualization is not yet implemented in crossgen2
CORINFO_DEVIRTUALIZATION_COUNT, // sentinel for maximum value
};

Expand Down
12 changes: 6 additions & 6 deletions src/coreclr/inc/jiteeversionguid.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,13 +43,13 @@ typedef const GUID *LPCGUID;
#define GUID_DEFINED
#endif // !GUID_DEFINED

constexpr GUID JITEEVersionIdentifier = { /* 2335da47-1d6c-4844-96b6-025558a525ba */
0x2335da47,
0x1d6c,
0x4844,
{0x96, 0xb6, 0x02, 0x55, 0x58, 0xa5, 0x25, 0xba}
constexpr GUID JITEEVersionIdentifier = { /* ba2c087c-9b8b-49c1-a52f-3514eb489308 */
0xba2c087c,
0x9b8b,
0x49c1,
{0xa5, 0x2f, 0x35, 0x14, 0xeb, 0x48, 0x93, 0x08}
};

//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// END JITEEVersionIdentifier
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/jit/compiler.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -10353,6 +10353,8 @@ const char* Compiler::devirtualizationDetailToString(CORINFO_DEVIRTUALIZATION_DE
"interface implementations";
case CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE:
return "Decl method cannot be represented in R2R image";
case CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE:
return "Support for type equivalence in devirtualization is not yet implemented in crossgen2";
default:
return "undefined";
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -45,6 +45,14 @@ private sealed class ValidTypeHashTable : LockFreeReaderHashtable<TypeDesc, Type

private static TypeDesc EnsureLoadableTypeUncached(TypeDesc type)
{
if (type.TypeIdentifierData != null)
{
if (!type.TypeHasCharacteristicsRequiredToBeLoadableTypeEquivalentType)
{
ThrowHelper.ThrowTypeLoadException(ExceptionStringID.ClassLoadGeneral, type);
}
}

if (type.IsParameterizedType)
{
// Validate parameterized types
Expand Down
8 changes: 6 additions & 2 deletions src/coreclr/tools/Common/Compiler/TypeExtensions.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -322,7 +322,7 @@ public static TypeDesc MergeTypesToCommonParent(TypeDesc ta, TypeDesc tb)
bDepth--;
}

while (ta != tb)
while (!ta.IsEquivalentTo(tb))
{
ta = ta.BaseType;
tb = tb.BaseType;
Expand DownExpand Up@@ -350,7 +350,11 @@ private static TypeDesc MergeArrayTypesToCommonParent(ArrayType ta, ArrayType tb
Debug.Assert(taElem != tbElem);

TypeDesc mergeElem;
if (taElem.IsArray && tbElem.IsArray)
if (taElem.IsEquivalentTo(tbElem))
{
mergeElem = taElem;
}
else if (taElem.IsArray && tbElem.IsArray)
{
mergeElem = MergeArrayTypesToCommonParent((ArrayType)taElem, (ArrayType)tbElem);
}
Expand Down
7 changes: 7 additions & 0 deletions src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -857,6 +857,10 @@ private void Get_CORINFO_SIG_INFO(MethodSignature signature, CORINFO_SIG_INFO* s
sig->_retType = (byte)corInfoRetType;
sig->retTypeSigClass = ObjectToHandle(signature.ReturnType);

#if READYTORUN
ValidateSafetyOfUsingTypeEquivalenceOfType(signature.ReturnType);
#endif

sig->flags = 0; // used by IL stubs code

sig->numArgs = (ushort)signature.Length;
Expand DownExpand Up@@ -1756,6 +1760,7 @@ private void resolveToken(ref CORINFO_RESOLVED_TOKEN pResolvedToken)
ModuleToken methodModuleToken = HandleToModuleToken(ref pResolvedToken);
var resolver = _compilation.NodeFactory.Resolver;
resolver.AddModuleTokenForMethod(method, methodModuleToken);
ValidateSafetyOfUsingTypeEquivalenceInSignature(method.Signature);
}
#else
_compilation.NodeFactory.MetadataManager.GetDependenciesDueToAccess(ref _additionalDependencies, _compilation.NodeFactory, (MethodIL)methodIL, method);
Expand All@@ -1782,6 +1787,8 @@ private void resolveToken(ref CORINFO_RESOLVED_TOKEN pResolvedToken)

#if !READYTORUN
_compilation.NodeFactory.MetadataManager.GetDependenciesDueToAccess(ref _additionalDependencies, _compilation.NodeFactory, (MethodIL)methodIL, field);
#else
ValidateSafetyOfUsingTypeEquivalenceOfType(field.FieldType);
#endif
}
else
Expand Down
1 change: 1 addition & 0 deletions src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -1058,6 +1058,7 @@ public enum CORINFO_DEVIRTUALIZATION_DETAIL
CORINFO_DEVIRTUALIZATION_FAILED_BUBBLE_IMPL_NOT_REFERENCEABLE, // object class cannot be referenced from R2R code due to missing tokens
CORINFO_DEVIRTUALIZATION_FAILED_DUPLICATE_INTERFACE, // crossgen2 virtual method algorithm and runtime algorithm differ in the presence of duplicate interface implementations
CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE, // Decl method cannot be represented in R2R image
CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE, // Support for type equivalence in devirtualization is not yet implemented in crossgen2
CORINFO_DEVIRTUALIZATION_COUNT, // sentinel for maximum value
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Type equivalence support in Crossgen2 by davidwrighton · Pull Request #87899 · dotnet/runtime · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
1 change: 1 addition & 0 deletions src/coreclr/inc/corinfo.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -1634,6 +1634,7 @@ enum CORINFO_DEVIRTUALIZATION_DETAIL
CORINFO_DEVIRTUALIZATION_FAILED_BUBBLE_IMPL_NOT_REFERENCEABLE, // object class cannot be referenced from R2R code due to missing tokens
CORINFO_DEVIRTUALIZATION_FAILED_DUPLICATE_INTERFACE, // crossgen2 virtual method algorithm and runtime algorithm differ in the presence of duplicate interface implementations
CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE, // Decl method cannot be represented in R2R image
CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE, // Support for type equivalence in devirtualization is not yet implemented in crossgen2
CORINFO_DEVIRTUALIZATION_COUNT, // sentinel for maximum value
};

Expand Down
12 changes: 6 additions & 6 deletions src/coreclr/inc/jiteeversionguid.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,13 +43,13 @@ typedef const GUID *LPCGUID;
#define GUID_DEFINED
#endif // !GUID_DEFINED

constexpr GUID JITEEVersionIdentifier = { /* 2335da47-1d6c-4844-96b6-025558a525ba */
0x2335da47,
0x1d6c,
0x4844,
{0x96, 0xb6, 0x02, 0x55, 0x58, 0xa5, 0x25, 0xba}
constexpr GUID JITEEVersionIdentifier = { /* ba2c087c-9b8b-49c1-a52f-3514eb489308 */
0xba2c087c,
0x9b8b,
0x49c1,
{0xa5, 0x2f, 0x35, 0x14, 0xeb, 0x48, 0x93, 0x08}
};

//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// END JITEEVersionIdentifier
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/jit/compiler.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -10353,6 +10353,8 @@ const char* Compiler::devirtualizationDetailToString(CORINFO_DEVIRTUALIZATION_DE
"interface implementations";
case CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE:
return "Decl method cannot be represented in R2R image";
case CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE:
return "Support for type equivalence in devirtualization is not yet implemented in crossgen2";
default:
return "undefined";
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -45,6 +45,14 @@ private sealed class ValidTypeHashTable : LockFreeReaderHashtable<TypeDesc, Type

private static TypeDesc EnsureLoadableTypeUncached(TypeDesc type)
{
if (type.TypeIdentifierData != null)
{
if (!type.TypeHasCharacteristicsRequiredToBeLoadableTypeEquivalentType)
{
ThrowHelper.ThrowTypeLoadException(ExceptionStringID.ClassLoadGeneral, type);
}
}

if (type.IsParameterizedType)
{
// Validate parameterized types
Expand Down
8 changes: 6 additions & 2 deletions src/coreclr/tools/Common/Compiler/TypeExtensions.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -322,7 +322,7 @@ public static TypeDesc MergeTypesToCommonParent(TypeDesc ta, TypeDesc tb)
bDepth--;
}

while (ta != tb)
while (!ta.IsEquivalentTo(tb))
{
ta = ta.BaseType;
tb = tb.BaseType;
Expand DownExpand Up@@ -350,7 +350,11 @@ private static TypeDesc MergeArrayTypesToCommonParent(ArrayType ta, ArrayType tb
Debug.Assert(taElem != tbElem);

TypeDesc mergeElem;
if (taElem.IsArray && tbElem.IsArray)
if (taElem.IsEquivalentTo(tbElem))
{
mergeElem = taElem;
}
else if (taElem.IsArray && tbElem.IsArray)
{
mergeElem = MergeArrayTypesToCommonParent((ArrayType)taElem, (ArrayType)tbElem);
}
Expand Down
7 changes: 7 additions & 0 deletions src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -857,6 +857,10 @@ private void Get_CORINFO_SIG_INFO(MethodSignature signature, CORINFO_SIG_INFO* s
sig->_retType = (byte)corInfoRetType;
sig->retTypeSigClass = ObjectToHandle(signature.ReturnType);

#if READYTORUN
ValidateSafetyOfUsingTypeEquivalenceOfType(signature.ReturnType);
#endif

sig->flags = 0; // used by IL stubs code

sig->numArgs = (ushort)signature.Length;
Expand DownExpand Up@@ -1756,6 +1760,7 @@ private void resolveToken(ref CORINFO_RESOLVED_TOKEN pResolvedToken)
ModuleToken methodModuleToken = HandleToModuleToken(ref pResolvedToken);
var resolver = _compilation.NodeFactory.Resolver;
resolver.AddModuleTokenForMethod(method, methodModuleToken);
ValidateSafetyOfUsingTypeEquivalenceInSignature(method.Signature);
}
#else
_compilation.NodeFactory.MetadataManager.GetDependenciesDueToAccess(ref _additionalDependencies, _compilation.NodeFactory, (MethodIL)methodIL, method);
Expand All@@ -1782,6 +1787,8 @@ private void resolveToken(ref CORINFO_RESOLVED_TOKEN pResolvedToken)

#if !READYTORUN
_compilation.NodeFactory.MetadataManager.GetDependenciesDueToAccess(ref _additionalDependencies, _compilation.NodeFactory, (MethodIL)methodIL, field);
#else
ValidateSafetyOfUsingTypeEquivalenceOfType(field.FieldType);
#endif
}
else
Expand Down
1 change: 1 addition & 0 deletions src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -1058,6 +1058,7 @@ public enum CORINFO_DEVIRTUALIZATION_DETAIL
CORINFO_DEVIRTUALIZATION_FAILED_BUBBLE_IMPL_NOT_REFERENCEABLE, // object class cannot be referenced from R2R code due to missing tokens
CORINFO_DEVIRTUALIZATION_FAILED_DUPLICATE_INTERFACE, // crossgen2 virtual method algorithm and runtime algorithm differ in the presence of duplicate interface implementations
CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE, // Decl method cannot be represented in R2R image
CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE, // Support for type equivalence in devirtualization is not yet implemented in crossgen2
CORINFO_DEVIRTUALIZATION_COUNT, // sentinel for maximum value
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Type equivalence support in Crossgen2 by davidwrighton · Pull Request #87899 · dotnet/runtime · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
1 change: 1 addition & 0 deletions src/coreclr/inc/corinfo.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -1634,6 +1634,7 @@ enum CORINFO_DEVIRTUALIZATION_DETAIL
CORINFO_DEVIRTUALIZATION_FAILED_BUBBLE_IMPL_NOT_REFERENCEABLE, // object class cannot be referenced from R2R code due to missing tokens
CORINFO_DEVIRTUALIZATION_FAILED_DUPLICATE_INTERFACE, // crossgen2 virtual method algorithm and runtime algorithm differ in the presence of duplicate interface implementations
CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE, // Decl method cannot be represented in R2R image
CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE, // Support for type equivalence in devirtualization is not yet implemented in crossgen2
CORINFO_DEVIRTUALIZATION_COUNT, // sentinel for maximum value
};

Expand Down
12 changes: 6 additions & 6 deletions src/coreclr/inc/jiteeversionguid.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,13 +43,13 @@ typedef const GUID *LPCGUID;
#define GUID_DEFINED
#endif // !GUID_DEFINED

constexpr GUID JITEEVersionIdentifier = { /* 2335da47-1d6c-4844-96b6-025558a525ba */
0x2335da47,
0x1d6c,
0x4844,
{0x96, 0xb6, 0x02, 0x55, 0x58, 0xa5, 0x25, 0xba}
constexpr GUID JITEEVersionIdentifier = { /* ba2c087c-9b8b-49c1-a52f-3514eb489308 */
0xba2c087c,
0x9b8b,
0x49c1,
{0xa5, 0x2f, 0x35, 0x14, 0xeb, 0x48, 0x93, 0x08}
};

//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// END JITEEVersionIdentifier
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/jit/compiler.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -10353,6 +10353,8 @@ const char* Compiler::devirtualizationDetailToString(CORINFO_DEVIRTUALIZATION_DE
"interface implementations";
case CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE:
return "Decl method cannot be represented in R2R image";
case CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE:
return "Support for type equivalence in devirtualization is not yet implemented in crossgen2";
default:
return "undefined";
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -45,6 +45,14 @@ private sealed class ValidTypeHashTable : LockFreeReaderHashtable<TypeDesc, Type

private static TypeDesc EnsureLoadableTypeUncached(TypeDesc type)
{
if (type.TypeIdentifierData != null)
{
if (!type.TypeHasCharacteristicsRequiredToBeLoadableTypeEquivalentType)
{
ThrowHelper.ThrowTypeLoadException(ExceptionStringID.ClassLoadGeneral, type);
}
}

if (type.IsParameterizedType)
{
// Validate parameterized types
Expand Down
8 changes: 6 additions & 2 deletions src/coreclr/tools/Common/Compiler/TypeExtensions.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -322,7 +322,7 @@ public static TypeDesc MergeTypesToCommonParent(TypeDesc ta, TypeDesc tb)
bDepth--;
}

while (ta != tb)
while (!ta.IsEquivalentTo(tb))
{
ta = ta.BaseType;
tb = tb.BaseType;
Expand DownExpand Up@@ -350,7 +350,11 @@ private static TypeDesc MergeArrayTypesToCommonParent(ArrayType ta, ArrayType tb
Debug.Assert(taElem != tbElem);

TypeDesc mergeElem;
if (taElem.IsArray && tbElem.IsArray)
if (taElem.IsEquivalentTo(tbElem))
{
mergeElem = taElem;
}
else if (taElem.IsArray && tbElem.IsArray)
{
mergeElem = MergeArrayTypesToCommonParent((ArrayType)taElem, (ArrayType)tbElem);
}
Expand Down
7 changes: 7 additions & 0 deletions src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -857,6 +857,10 @@ private void Get_CORINFO_SIG_INFO(MethodSignature signature, CORINFO_SIG_INFO* s
sig->_retType = (byte)corInfoRetType;
sig->retTypeSigClass = ObjectToHandle(signature.ReturnType);

#if READYTORUN
ValidateSafetyOfUsingTypeEquivalenceOfType(signature.ReturnType);
#endif

sig->flags = 0; // used by IL stubs code

sig->numArgs = (ushort)signature.Length;
Expand DownExpand Up@@ -1756,6 +1760,7 @@ private void resolveToken(ref CORINFO_RESOLVED_TOKEN pResolvedToken)
ModuleToken methodModuleToken = HandleToModuleToken(ref pResolvedToken);
var resolver = _compilation.NodeFactory.Resolver;
resolver.AddModuleTokenForMethod(method, methodModuleToken);
ValidateSafetyOfUsingTypeEquivalenceInSignature(method.Signature);
}
#else
_compilation.NodeFactory.MetadataManager.GetDependenciesDueToAccess(ref _additionalDependencies, _compilation.NodeFactory, (MethodIL)methodIL, method);
Expand All@@ -1782,6 +1787,8 @@ private void resolveToken(ref CORINFO_RESOLVED_TOKEN pResolvedToken)

#if !READYTORUN
_compilation.NodeFactory.MetadataManager.GetDependenciesDueToAccess(ref _additionalDependencies, _compilation.NodeFactory, (MethodIL)methodIL, field);
#else
ValidateSafetyOfUsingTypeEquivalenceOfType(field.FieldType);
#endif
}
else
Expand Down
1 change: 1 addition & 0 deletions src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -1058,6 +1058,7 @@ public enum CORINFO_DEVIRTUALIZATION_DETAIL
CORINFO_DEVIRTUALIZATION_FAILED_BUBBLE_IMPL_NOT_REFERENCEABLE, // object class cannot be referenced from R2R code due to missing tokens
CORINFO_DEVIRTUALIZATION_FAILED_DUPLICATE_INTERFACE, // crossgen2 virtual method algorithm and runtime algorithm differ in the presence of duplicate interface implementations
CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE, // Decl method cannot be represented in R2R image
CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE, // Support for type equivalence in devirtualization is not yet implemented in crossgen2
CORINFO_DEVIRTUALIZATION_COUNT, // sentinel for maximum value
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Type equivalence support in Crossgen2 by davidwrighton · Pull Request #87899 · dotnet/runtime · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
1 change: 1 addition & 0 deletions src/coreclr/inc/corinfo.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -1634,6 +1634,7 @@ enum CORINFO_DEVIRTUALIZATION_DETAIL
CORINFO_DEVIRTUALIZATION_FAILED_BUBBLE_IMPL_NOT_REFERENCEABLE, // object class cannot be referenced from R2R code due to missing tokens
CORINFO_DEVIRTUALIZATION_FAILED_DUPLICATE_INTERFACE, // crossgen2 virtual method algorithm and runtime algorithm differ in the presence of duplicate interface implementations
CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE, // Decl method cannot be represented in R2R image
CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE, // Support for type equivalence in devirtualization is not yet implemented in crossgen2
CORINFO_DEVIRTUALIZATION_COUNT, // sentinel for maximum value
};

Expand Down
12 changes: 6 additions & 6 deletions src/coreclr/inc/jiteeversionguid.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,13 +43,13 @@ typedef const GUID *LPCGUID;
#define GUID_DEFINED
#endif // !GUID_DEFINED

constexpr GUID JITEEVersionIdentifier = { /* 2335da47-1d6c-4844-96b6-025558a525ba */
0x2335da47,
0x1d6c,
0x4844,
{0x96, 0xb6, 0x02, 0x55, 0x58, 0xa5, 0x25, 0xba}
constexpr GUID JITEEVersionIdentifier = { /* ba2c087c-9b8b-49c1-a52f-3514eb489308 */
0xba2c087c,
0x9b8b,
0x49c1,
{0xa5, 0x2f, 0x35, 0x14, 0xeb, 0x48, 0x93, 0x08}
};

//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// END JITEEVersionIdentifier
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/jit/compiler.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -10353,6 +10353,8 @@ const char* Compiler::devirtualizationDetailToString(CORINFO_DEVIRTUALIZATION_DE
"interface implementations";
case CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE:
return "Decl method cannot be represented in R2R image";
case CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE:
return "Support for type equivalence in devirtualization is not yet implemented in crossgen2";
default:
return "undefined";
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -45,6 +45,14 @@ private sealed class ValidTypeHashTable : LockFreeReaderHashtable<TypeDesc, Type

private static TypeDesc EnsureLoadableTypeUncached(TypeDesc type)
{
if (type.TypeIdentifierData != null)
{
if (!type.TypeHasCharacteristicsRequiredToBeLoadableTypeEquivalentType)
{
ThrowHelper.ThrowTypeLoadException(ExceptionStringID.ClassLoadGeneral, type);
}
}

if (type.IsParameterizedType)
{
// Validate parameterized types
Expand Down
8 changes: 6 additions & 2 deletions src/coreclr/tools/Common/Compiler/TypeExtensions.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -322,7 +322,7 @@ public static TypeDesc MergeTypesToCommonParent(TypeDesc ta, TypeDesc tb)
bDepth--;
}

while (ta != tb)
while (!ta.IsEquivalentTo(tb))
{
ta = ta.BaseType;
tb = tb.BaseType;
Expand DownExpand Up@@ -350,7 +350,11 @@ private static TypeDesc MergeArrayTypesToCommonParent(ArrayType ta, ArrayType tb
Debug.Assert(taElem != tbElem);

TypeDesc mergeElem;
if (taElem.IsArray && tbElem.IsArray)
if (taElem.IsEquivalentTo(tbElem))
{
mergeElem = taElem;
}
else if (taElem.IsArray && tbElem.IsArray)
{
mergeElem = MergeArrayTypesToCommonParent((ArrayType)taElem, (ArrayType)tbElem);
}
Expand Down
7 changes: 7 additions & 0 deletions src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -857,6 +857,10 @@ private void Get_CORINFO_SIG_INFO(MethodSignature signature, CORINFO_SIG_INFO* s
sig->_retType = (byte)corInfoRetType;
sig->retTypeSigClass = ObjectToHandle(signature.ReturnType);

#if READYTORUN
ValidateSafetyOfUsingTypeEquivalenceOfType(signature.ReturnType);
#endif

sig->flags = 0; // used by IL stubs code

sig->numArgs = (ushort)signature.Length;
Expand DownExpand Up@@ -1756,6 +1760,7 @@ private void resolveToken(ref CORINFO_RESOLVED_TOKEN pResolvedToken)
ModuleToken methodModuleToken = HandleToModuleToken(ref pResolvedToken);
var resolver = _compilation.NodeFactory.Resolver;
resolver.AddModuleTokenForMethod(method, methodModuleToken);
ValidateSafetyOfUsingTypeEquivalenceInSignature(method.Signature);
}
#else
_compilation.NodeFactory.MetadataManager.GetDependenciesDueToAccess(ref _additionalDependencies, _compilation.NodeFactory, (MethodIL)methodIL, method);
Expand All@@ -1782,6 +1787,8 @@ private void resolveToken(ref CORINFO_RESOLVED_TOKEN pResolvedToken)

#if !READYTORUN
_compilation.NodeFactory.MetadataManager.GetDependenciesDueToAccess(ref _additionalDependencies, _compilation.NodeFactory, (MethodIL)methodIL, field);
#else
ValidateSafetyOfUsingTypeEquivalenceOfType(field.FieldType);
#endif
}
else
Expand Down
1 change: 1 addition & 0 deletions src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -1058,6 +1058,7 @@ public enum CORINFO_DEVIRTUALIZATION_DETAIL
CORINFO_DEVIRTUALIZATION_FAILED_BUBBLE_IMPL_NOT_REFERENCEABLE, // object class cannot be referenced from R2R code due to missing tokens
CORINFO_DEVIRTUALIZATION_FAILED_DUPLICATE_INTERFACE, // crossgen2 virtual method algorithm and runtime algorithm differ in the presence of duplicate interface implementations
CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE, // Decl method cannot be represented in R2R image
CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE, // Support for type equivalence in devirtualization is not yet implemented in crossgen2
CORINFO_DEVIRTUALIZATION_COUNT, // sentinel for maximum value
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Type equivalence support in Crossgen2 by davidwrighton · Pull Request #87899 · dotnet/runtime · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
1 change: 1 addition & 0 deletions src/coreclr/inc/corinfo.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -1634,6 +1634,7 @@ enum CORINFO_DEVIRTUALIZATION_DETAIL
CORINFO_DEVIRTUALIZATION_FAILED_BUBBLE_IMPL_NOT_REFERENCEABLE, // object class cannot be referenced from R2R code due to missing tokens
CORINFO_DEVIRTUALIZATION_FAILED_DUPLICATE_INTERFACE, // crossgen2 virtual method algorithm and runtime algorithm differ in the presence of duplicate interface implementations
CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE, // Decl method cannot be represented in R2R image
CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE, // Support for type equivalence in devirtualization is not yet implemented in crossgen2
CORINFO_DEVIRTUALIZATION_COUNT, // sentinel for maximum value
};

Expand Down
12 changes: 6 additions & 6 deletions src/coreclr/inc/jiteeversionguid.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,13 +43,13 @@ typedef const GUID *LPCGUID;
#define GUID_DEFINED
#endif // !GUID_DEFINED

constexpr GUID JITEEVersionIdentifier = { /* 2335da47-1d6c-4844-96b6-025558a525ba */
0x2335da47,
0x1d6c,
0x4844,
{0x96, 0xb6, 0x02, 0x55, 0x58, 0xa5, 0x25, 0xba}
constexpr GUID JITEEVersionIdentifier = { /* ba2c087c-9b8b-49c1-a52f-3514eb489308 */
0xba2c087c,
0x9b8b,
0x49c1,
{0xa5, 0x2f, 0x35, 0x14, 0xeb, 0x48, 0x93, 0x08}
};

//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// END JITEEVersionIdentifier
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/jit/compiler.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -10353,6 +10353,8 @@ const char* Compiler::devirtualizationDetailToString(CORINFO_DEVIRTUALIZATION_DE
"interface implementations";
case CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE:
return "Decl method cannot be represented in R2R image";
case CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE:
return "Support for type equivalence in devirtualization is not yet implemented in crossgen2";
default:
return "undefined";
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -45,6 +45,14 @@ private sealed class ValidTypeHashTable : LockFreeReaderHashtable<TypeDesc, Type

private static TypeDesc EnsureLoadableTypeUncached(TypeDesc type)
{
if (type.TypeIdentifierData != null)
{
if (!type.TypeHasCharacteristicsRequiredToBeLoadableTypeEquivalentType)
{
ThrowHelper.ThrowTypeLoadException(ExceptionStringID.ClassLoadGeneral, type);
}
}

if (type.IsParameterizedType)
{
// Validate parameterized types
Expand Down
8 changes: 6 additions & 2 deletions src/coreclr/tools/Common/Compiler/TypeExtensions.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -322,7 +322,7 @@ public static TypeDesc MergeTypesToCommonParent(TypeDesc ta, TypeDesc tb)
bDepth--;
}

while (ta != tb)
while (!ta.IsEquivalentTo(tb))
{
ta = ta.BaseType;
tb = tb.BaseType;
Expand DownExpand Up@@ -350,7 +350,11 @@ private static TypeDesc MergeArrayTypesToCommonParent(ArrayType ta, ArrayType tb
Debug.Assert(taElem != tbElem);

TypeDesc mergeElem;
if (taElem.IsArray && tbElem.IsArray)
if (taElem.IsEquivalentTo(tbElem))
{
mergeElem = taElem;
}
else if (taElem.IsArray && tbElem.IsArray)
{
mergeElem = MergeArrayTypesToCommonParent((ArrayType)taElem, (ArrayType)tbElem);
}
Expand Down
7 changes: 7 additions & 0 deletions src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -857,6 +857,10 @@ private void Get_CORINFO_SIG_INFO(MethodSignature signature, CORINFO_SIG_INFO* s
sig->_retType = (byte)corInfoRetType;
sig->retTypeSigClass = ObjectToHandle(signature.ReturnType);

#if READYTORUN
ValidateSafetyOfUsingTypeEquivalenceOfType(signature.ReturnType);
#endif

sig->flags = 0; // used by IL stubs code

sig->numArgs = (ushort)signature.Length;
Expand DownExpand Up@@ -1756,6 +1760,7 @@ private void resolveToken(ref CORINFO_RESOLVED_TOKEN pResolvedToken)
ModuleToken methodModuleToken = HandleToModuleToken(ref pResolvedToken);
var resolver = _compilation.NodeFactory.Resolver;
resolver.AddModuleTokenForMethod(method, methodModuleToken);
ValidateSafetyOfUsingTypeEquivalenceInSignature(method.Signature);
}
#else
_compilation.NodeFactory.MetadataManager.GetDependenciesDueToAccess(ref _additionalDependencies, _compilation.NodeFactory, (MethodIL)methodIL, method);
Expand All@@ -1782,6 +1787,8 @@ private void resolveToken(ref CORINFO_RESOLVED_TOKEN pResolvedToken)

#if !READYTORUN
_compilation.NodeFactory.MetadataManager.GetDependenciesDueToAccess(ref _additionalDependencies, _compilation.NodeFactory, (MethodIL)methodIL, field);
#else
ValidateSafetyOfUsingTypeEquivalenceOfType(field.FieldType);
#endif
}
else
Expand Down
1 change: 1 addition & 0 deletions src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -1058,6 +1058,7 @@ public enum CORINFO_DEVIRTUALIZATION_DETAIL
CORINFO_DEVIRTUALIZATION_FAILED_BUBBLE_IMPL_NOT_REFERENCEABLE, // object class cannot be referenced from R2R code due to missing tokens
CORINFO_DEVIRTUALIZATION_FAILED_DUPLICATE_INTERFACE, // crossgen2 virtual method algorithm and runtime algorithm differ in the presence of duplicate interface implementations
CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE, // Decl method cannot be represented in R2R image
CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE, // Support for type equivalence in devirtualization is not yet implemented in crossgen2
CORINFO_DEVIRTUALIZATION_COUNT, // sentinel for maximum value
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Type equivalence support in Crossgen2 by davidwrighton · Pull Request #87899 · dotnet/runtime · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
1 change: 1 addition & 0 deletions src/coreclr/inc/corinfo.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -1634,6 +1634,7 @@ enum CORINFO_DEVIRTUALIZATION_DETAIL
CORINFO_DEVIRTUALIZATION_FAILED_BUBBLE_IMPL_NOT_REFERENCEABLE, // object class cannot be referenced from R2R code due to missing tokens
CORINFO_DEVIRTUALIZATION_FAILED_DUPLICATE_INTERFACE, // crossgen2 virtual method algorithm and runtime algorithm differ in the presence of duplicate interface implementations
CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE, // Decl method cannot be represented in R2R image
CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE, // Support for type equivalence in devirtualization is not yet implemented in crossgen2
CORINFO_DEVIRTUALIZATION_COUNT, // sentinel for maximum value
};

Expand Down
12 changes: 6 additions & 6 deletions src/coreclr/inc/jiteeversionguid.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,13 +43,13 @@ typedef const GUID *LPCGUID;
#define GUID_DEFINED
#endif // !GUID_DEFINED

constexpr GUID JITEEVersionIdentifier = { /* 2335da47-1d6c-4844-96b6-025558a525ba */
0x2335da47,
0x1d6c,
0x4844,
{0x96, 0xb6, 0x02, 0x55, 0x58, 0xa5, 0x25, 0xba}
constexpr GUID JITEEVersionIdentifier = { /* ba2c087c-9b8b-49c1-a52f-3514eb489308 */
0xba2c087c,
0x9b8b,
0x49c1,
{0xa5, 0x2f, 0x35, 0x14, 0xeb, 0x48, 0x93, 0x08}
};

//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// END JITEEVersionIdentifier
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/jit/compiler.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -10353,6 +10353,8 @@ const char* Compiler::devirtualizationDetailToString(CORINFO_DEVIRTUALIZATION_DE
"interface implementations";
case CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE:
return "Decl method cannot be represented in R2R image";
case CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE:
return "Support for type equivalence in devirtualization is not yet implemented in crossgen2";
default:
return "undefined";
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -45,6 +45,14 @@ private sealed class ValidTypeHashTable : LockFreeReaderHashtable<TypeDesc, Type

private static TypeDesc EnsureLoadableTypeUncached(TypeDesc type)
{
if (type.TypeIdentifierData != null)
{
if (!type.TypeHasCharacteristicsRequiredToBeLoadableTypeEquivalentType)
{
ThrowHelper.ThrowTypeLoadException(ExceptionStringID.ClassLoadGeneral, type);
}
}

if (type.IsParameterizedType)
{
// Validate parameterized types
Expand Down
8 changes: 6 additions & 2 deletions src/coreclr/tools/Common/Compiler/TypeExtensions.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -322,7 +322,7 @@ public static TypeDesc MergeTypesToCommonParent(TypeDesc ta, TypeDesc tb)
bDepth--;
}

while (ta != tb)
while (!ta.IsEquivalentTo(tb))
{
ta = ta.BaseType;
tb = tb.BaseType;
Expand DownExpand Up@@ -350,7 +350,11 @@ private static TypeDesc MergeArrayTypesToCommonParent(ArrayType ta, ArrayType tb
Debug.Assert(taElem != tbElem);

TypeDesc mergeElem;
if (taElem.IsArray && tbElem.IsArray)
if (taElem.IsEquivalentTo(tbElem))
{
mergeElem = taElem;
}
else if (taElem.IsArray && tbElem.IsArray)
{
mergeElem = MergeArrayTypesToCommonParent((ArrayType)taElem, (ArrayType)tbElem);
}
Expand Down
7 changes: 7 additions & 0 deletions src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -857,6 +857,10 @@ private void Get_CORINFO_SIG_INFO(MethodSignature signature, CORINFO_SIG_INFO* s
sig->_retType = (byte)corInfoRetType;
sig->retTypeSigClass = ObjectToHandle(signature.ReturnType);

#if READYTORUN
ValidateSafetyOfUsingTypeEquivalenceOfType(signature.ReturnType);
#endif

sig->flags = 0; // used by IL stubs code

sig->numArgs = (ushort)signature.Length;
Expand DownExpand Up@@ -1756,6 +1760,7 @@ private void resolveToken(ref CORINFO_RESOLVED_TOKEN pResolvedToken)
ModuleToken methodModuleToken = HandleToModuleToken(ref pResolvedToken);
var resolver = _compilation.NodeFactory.Resolver;
resolver.AddModuleTokenForMethod(method, methodModuleToken);
ValidateSafetyOfUsingTypeEquivalenceInSignature(method.Signature);
}
#else
_compilation.NodeFactory.MetadataManager.GetDependenciesDueToAccess(ref _additionalDependencies, _compilation.NodeFactory, (MethodIL)methodIL, method);
Expand All@@ -1782,6 +1787,8 @@ private void resolveToken(ref CORINFO_RESOLVED_TOKEN pResolvedToken)

#if !READYTORUN
_compilation.NodeFactory.MetadataManager.GetDependenciesDueToAccess(ref _additionalDependencies, _compilation.NodeFactory, (MethodIL)methodIL, field);
#else
ValidateSafetyOfUsingTypeEquivalenceOfType(field.FieldType);
#endif
}
else
Expand Down
1 change: 1 addition & 0 deletions src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -1058,6 +1058,7 @@ public enum CORINFO_DEVIRTUALIZATION_DETAIL
CORINFO_DEVIRTUALIZATION_FAILED_BUBBLE_IMPL_NOT_REFERENCEABLE, // object class cannot be referenced from R2R code due to missing tokens
CORINFO_DEVIRTUALIZATION_FAILED_DUPLICATE_INTERFACE, // crossgen2 virtual method algorithm and runtime algorithm differ in the presence of duplicate interface implementations
CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE, // Decl method cannot be represented in R2R image
CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE, // Support for type equivalence in devirtualization is not yet implemented in crossgen2
CORINFO_DEVIRTUALIZATION_COUNT, // sentinel for maximum value
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Type equivalence support in Crossgen2 by davidwrighton · Pull Request #87899 · dotnet/runtime · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
1 change: 1 addition & 0 deletions src/coreclr/inc/corinfo.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -1634,6 +1634,7 @@ enum CORINFO_DEVIRTUALIZATION_DETAIL
CORINFO_DEVIRTUALIZATION_FAILED_BUBBLE_IMPL_NOT_REFERENCEABLE, // object class cannot be referenced from R2R code due to missing tokens
CORINFO_DEVIRTUALIZATION_FAILED_DUPLICATE_INTERFACE, // crossgen2 virtual method algorithm and runtime algorithm differ in the presence of duplicate interface implementations
CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE, // Decl method cannot be represented in R2R image
CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE, // Support for type equivalence in devirtualization is not yet implemented in crossgen2
CORINFO_DEVIRTUALIZATION_COUNT, // sentinel for maximum value
};

Expand Down
12 changes: 6 additions & 6 deletions src/coreclr/inc/jiteeversionguid.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,13 +43,13 @@ typedef const GUID *LPCGUID;
#define GUID_DEFINED
#endif // !GUID_DEFINED

constexpr GUID JITEEVersionIdentifier = { /* 2335da47-1d6c-4844-96b6-025558a525ba */
0x2335da47,
0x1d6c,
0x4844,
{0x96, 0xb6, 0x02, 0x55, 0x58, 0xa5, 0x25, 0xba}
constexpr GUID JITEEVersionIdentifier = { /* ba2c087c-9b8b-49c1-a52f-3514eb489308 */
0xba2c087c,
0x9b8b,
0x49c1,
{0xa5, 0x2f, 0x35, 0x14, 0xeb, 0x48, 0x93, 0x08}
};

//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// END JITEEVersionIdentifier
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/jit/compiler.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -10353,6 +10353,8 @@ const char* Compiler::devirtualizationDetailToString(CORINFO_DEVIRTUALIZATION_DE
"interface implementations";
case CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE:
return "Decl method cannot be represented in R2R image";
case CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE:
return "Support for type equivalence in devirtualization is not yet implemented in crossgen2";
default:
return "undefined";
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -45,6 +45,14 @@ private sealed class ValidTypeHashTable : LockFreeReaderHashtable<TypeDesc, Type

private static TypeDesc EnsureLoadableTypeUncached(TypeDesc type)
{
if (type.TypeIdentifierData != null)
{
if (!type.TypeHasCharacteristicsRequiredToBeLoadableTypeEquivalentType)
{
ThrowHelper.ThrowTypeLoadException(ExceptionStringID.ClassLoadGeneral, type);
}
}

if (type.IsParameterizedType)
{
// Validate parameterized types
Expand Down
8 changes: 6 additions & 2 deletions src/coreclr/tools/Common/Compiler/TypeExtensions.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -322,7 +322,7 @@ public static TypeDesc MergeTypesToCommonParent(TypeDesc ta, TypeDesc tb)
bDepth--;
}

while (ta != tb)
while (!ta.IsEquivalentTo(tb))
{
ta = ta.BaseType;
tb = tb.BaseType;
Expand DownExpand Up@@ -350,7 +350,11 @@ private static TypeDesc MergeArrayTypesToCommonParent(ArrayType ta, ArrayType tb
Debug.Assert(taElem != tbElem);

TypeDesc mergeElem;
if (taElem.IsArray && tbElem.IsArray)
if (taElem.IsEquivalentTo(tbElem))
{
mergeElem = taElem;
}
else if (taElem.IsArray && tbElem.IsArray)
{
mergeElem = MergeArrayTypesToCommonParent((ArrayType)taElem, (ArrayType)tbElem);
}
Expand Down
7 changes: 7 additions & 0 deletions src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -857,6 +857,10 @@ private void Get_CORINFO_SIG_INFO(MethodSignature signature, CORINFO_SIG_INFO* s
sig->_retType = (byte)corInfoRetType;
sig->retTypeSigClass = ObjectToHandle(signature.ReturnType);

#if READYTORUN
ValidateSafetyOfUsingTypeEquivalenceOfType(signature.ReturnType);
#endif

sig->flags = 0; // used by IL stubs code

sig->numArgs = (ushort)signature.Length;
Expand DownExpand Up@@ -1756,6 +1760,7 @@ private void resolveToken(ref CORINFO_RESOLVED_TOKEN pResolvedToken)
ModuleToken methodModuleToken = HandleToModuleToken(ref pResolvedToken);
var resolver = _compilation.NodeFactory.Resolver;
resolver.AddModuleTokenForMethod(method, methodModuleToken);
ValidateSafetyOfUsingTypeEquivalenceInSignature(method.Signature);
}
#else
_compilation.NodeFactory.MetadataManager.GetDependenciesDueToAccess(ref _additionalDependencies, _compilation.NodeFactory, (MethodIL)methodIL, method);
Expand All@@ -1782,6 +1787,8 @@ private void resolveToken(ref CORINFO_RESOLVED_TOKEN pResolvedToken)

#if !READYTORUN
_compilation.NodeFactory.MetadataManager.GetDependenciesDueToAccess(ref _additionalDependencies, _compilation.NodeFactory, (MethodIL)methodIL, field);
#else
ValidateSafetyOfUsingTypeEquivalenceOfType(field.FieldType);
#endif
}
else
Expand Down
1 change: 1 addition & 0 deletions src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -1058,6 +1058,7 @@ public enum CORINFO_DEVIRTUALIZATION_DETAIL
CORINFO_DEVIRTUALIZATION_FAILED_BUBBLE_IMPL_NOT_REFERENCEABLE, // object class cannot be referenced from R2R code due to missing tokens
CORINFO_DEVIRTUALIZATION_FAILED_DUPLICATE_INTERFACE, // crossgen2 virtual method algorithm and runtime algorithm differ in the presence of duplicate interface implementations
CORINFO_DEVIRTUALIZATION_FAILED_DECL_NOT_REPRESENTABLE, // Decl method cannot be represented in R2R image
CORINFO_DEVIRTUALIZATION_FAILED_TYPE_EQUIVALENCE, // Support for type equivalence in devirtualization is not yet implemented in crossgen2
CORINFO_DEVIRTUALIZATION_COUNT, // sentinel for maximum value
}

Expand Down
Loading