Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0 - #96291

Merged
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:UpdateCoredistoolsVersion
Jan 3, 2024
Merged

Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0#96291
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:UpdateCoredistoolsVersion

Conversation

@BruceForstall

Copy link
Copy Markdown
Contributor

No description provided.

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Dec 23, 2023
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:BruceForstall
Assignees:BruceForstall
Labels:

area-CodeGen-coreclr

Milestone:-

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Can you help me figure out how to debug a problem with this change?

This PR updates coredistools.dll/so/dylib to a newly built version. This PR includes #96286, which has various related changes but doesn't bump the coredistools package version. That PR passes GCStress.

This PR fails on linux x64 GCStress (maybe others), apparently during tests which are run out of process, so are spawned. Swapping in an older coredistools succeeds.

For example (in my local WSL build/run):

export DOTNET_TieredCompilation=0
export DOTNET_GCStress=4
...
brucefo@Megatron:~/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Regressions/Regressions$ export CORE_ROOT=/home/brucefo/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Tests/Core_Root
brucefo@Megatron:~/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Regressions/Regressions$ ./Regressions.sh
BEGIN EXECUTION
/home/brucefo/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Tests/Core_Root/corerun -p System.Reflection.Metadata.MetadataUpdater.IsSupported=false -p System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization=true Regressions.dll ''
13:02:44.759 Running test: Regressions/coreclr/0041/expl_double_1/expl_double_1.cmd
Fatal error. System.Runtime.InteropServices.SEHException (0x80004005): External component has thrown an exception.
at System.Diagnostics.Process.ForkAndExecProcess(System.Diagnostics.ProcessStartInfo, System.String, System.String[], System.String[], System.String, Boolean, UInt32, UInt32, UInt32[], Int32 ByRef, Int32 ByRef, Int32 ByRef, Boolean, Boolean)
at System.Diagnostics.Process.StartCore(System.Diagnostics.ProcessStartInfo)
at CoreclrTestLib.CoreclrTestWrapperLib.RunTest(System.String, System.String, System.String, System.String, System.String, System.String)
at TestLibrary.OutOfProcessTest.RunOutOfProcessTest(System.String)
at Program.<<Main>$>g__TestExecutor1|0_2(System.IO.StreamWriter, System.IO.StreamWriter, <>c__DisplayClass0_0 ByRef)
at Program.<Main>$(System.String[])
./Regressions.sh: line 444: 36140 Aborted $LAUNCHER $ExePath "${CLRTestExecutionArguments[@]}"
Expected: 100
Actual: 134
END EXECUTION - FAILED

The question is: how do I track down what is causing the 0x80004005 error? It seems I need to use lldb to get SOS functionality, and I'm not sure how to work with LLDB with multiple spawned processes as well as GCStress (so lots of "illegal" instructions). It seems that process handle --pass true --stop false --notify false SIGILL helps with GCStress, but I'm not sure how and where to stop when the actual interesting exception occurs.

Any suggestions?

@BruceForstallBruceForstall mentioned this pull request Jan 2, 2024
@janvorli

Copy link
Copy Markdown
Member

@BruceForstall I've just found that starting with LLDB 14, there is a setting to debug child processes - at fork, the debugger switches to the spawned process and continues debugging it. You can use the following LLDB command settings set target.process.follow-fork-mode child to enable that.

However, when debugging stuff in child process, I usually try to figure out the command line to run the child standalone so that I don't have to do anything special.

There is also an env variable BuildAsStandalone that you can set to true before building the tests. That causes the tests to be built the "old way" without multiple tests being merged". So, each test gets its own .sh. I find it useful in cases like this.

@janvorli

Copy link
Copy Markdown
Member

@BruceForstall I have tried to build your branch and build the tests with env var BuildAsStandalone=true. The baseservices/exceptions/unhandled/unhandledTester/unhandledTester.sh reproduces the issue in the main process, so you don't need to fiddle with child process debugging. Btw, with the GC stress, you'll also need to treat the SIGSEGV the same way as SIGILL, both are coming from the instrumentation.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Thanks! I'll go build with BuildAsStandalone=true.

@janvorli

Copy link
Copy Markdown
Member

I've also noticed that the issue occured on the first SIGILL, there were SIGSEGVs before that and they were processed ok. So just using process handle --pass true --stop false --notify false SIGSEGV will get the debugger break at the problematic spot.

@janvorli

Copy link
Copy Markdown
Member

It seems that the problem is actually that we only handle the STATUS_PRIVILEGED_INSTRUCTION as the GC stress instrumentation instruction exceptions. But the SIGILL generates STATUS_ILLEGAL_INSTRUCTION, which we don't process in any way, which explains the behavior.
The code looks like this:

 0x7fff792dcc2c: lock
0x7fff792dcc2d: hlt
0x7fff792dcc2e: movb $0x11, %cl
0x7fff792dcc30: hlt

My guess is that the "lock" is not expected there and may somehow stem from incorrect disassembly of the previous instruction when we instrument it.

@janvorli

janvorli commented Jan 2, 2024

Copy link
Copy Markdown
Member

Hmm, I guess this makes it clear:

(lldb) clru 0x7fff792dcc2c
Error: Failed to find runtime directory
Normal JIT generated code
System.Net.Sockets.SocketAsyncEventArgs.SetBuffer(System.Memory`1<Byte>)
ilAddr is 00007FFFF40DE8A8 pImport is 000000000140F570
Begin 00007FFF792DCC00, size 15e
00007fff792dcc00 55 push rbp
00007fff792dcc01 53 push rbx
00007fff792dcc02 4883ec28 sub rsp, 0x28
00007fff792dcc06 488d6c2430 lea rbp, [rsp + 0x30]
00007fff792dcc0b 488965d0 mov qword ptr [rbp - 0x30], rsp
00007fff792dcc0f 48897de0 mov qword ptr [rbp - 0x20], rdi
00007fff792dcc13 488975e8 mov qword ptr [rbp - 0x18], rsi
00007fff792dcc17 488955f0 mov qword ptr [rbp - 0x10], rdx
00007fff792dcc1b 40383f cmp byte ptr [rdi], dil
00007fff792dcc1e 488d8fac000000 lea rcx, [rdi + 0xac]
00007fff792dcc25 baffffffff mov edx, 0xffffffff
00007fff792dcc2a 33c0 xor eax, eax
>>> 00007fff792dcc2c f0 lock
00007fff`792dcc2d 0fb111 cmpxchg dword ptr [rcx], edx (gcstress)

Seems like we have skipped the lock and instrumented just the cmpxchg that the lock is part of.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Ah, interesting. The change here is that I've rebuilt coredistools with a current LLVM. That's the disassembler we're using for instrumenting during GCStress. Perhaps it has a bug disassembling "lock", or perhaps the VM needs to handle "lock" differently with the new disassembler?

@janvorli

Copy link
Copy Markdown
Member

One or the other may be true. Depends on whether the change in the coredistool / LLVM was intentional or not.

@BruceForstall
BruceForstallforce-pushed the UpdateCoredistoolsVersion branch from 5d807c0 to 235df7eCompareJanuary 3, 2024 04:34
@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

GCStress failures are #94393, #96364

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Thanks again for your help investigating.

There was code in coredistools to specially handle x86 prefixes, to work around an LLVM bug that didn't treat the prefixes as part of the prefixed instruction. I removed this code because it was written 7-8 years ago, and various information on the internet made it sound like the LLVM bug had been fixed. Apparently it has not been fixed, at least for lock. It is surprising that the problem only manifested on Linux and not Windows -- maybe we don't use lock on Windows?

In any case, I restored the removed code and everything looks good now.

@BruceForstallBruceForstall changed the title Update MicrosoftNETCoreCoreDisToolsVersion to 1.3.0Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0Jan 3, 2024
@BruceForstall
BruceForstallforce-pushed the UpdateCoredistoolsVersion branch from 235df7e to 5628601CompareJanuary 3, 2024 17:34
@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@jakobbotsch@kunalspathak @dotnet/jit-contrib PTAL

@kunalspathakkunalspathak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@BruceForstall
BruceForstall merged commit 9459844 into dotnet:mainJan 3, 2024
@BruceForstall
BruceForstall deleted the UpdateCoredistoolsVersion branch January 3, 2024 20:31
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Feb 3, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@BruceForstall@janvorli@kunalspathak
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0 - #96291

Merged
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:UpdateCoredistoolsVersion
Jan 3, 2024
Merged

Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0#96291
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:UpdateCoredistoolsVersion

Conversation

@BruceForstall

Copy link
Copy Markdown
Contributor

No description provided.

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Dec 23, 2023
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:BruceForstall
Assignees:BruceForstall
Labels:

area-CodeGen-coreclr

Milestone:-

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Can you help me figure out how to debug a problem with this change?

This PR updates coredistools.dll/so/dylib to a newly built version. This PR includes #96286, which has various related changes but doesn't bump the coredistools package version. That PR passes GCStress.

This PR fails on linux x64 GCStress (maybe others), apparently during tests which are run out of process, so are spawned. Swapping in an older coredistools succeeds.

For example (in my local WSL build/run):

export DOTNET_TieredCompilation=0
export DOTNET_GCStress=4
...
brucefo@Megatron:~/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Regressions/Regressions$ export CORE_ROOT=/home/brucefo/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Tests/Core_Root
brucefo@Megatron:~/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Regressions/Regressions$ ./Regressions.sh
BEGIN EXECUTION
/home/brucefo/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Tests/Core_Root/corerun -p System.Reflection.Metadata.MetadataUpdater.IsSupported=false -p System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization=true Regressions.dll ''
13:02:44.759 Running test: Regressions/coreclr/0041/expl_double_1/expl_double_1.cmd
Fatal error. System.Runtime.InteropServices.SEHException (0x80004005): External component has thrown an exception.
at System.Diagnostics.Process.ForkAndExecProcess(System.Diagnostics.ProcessStartInfo, System.String, System.String[], System.String[], System.String, Boolean, UInt32, UInt32, UInt32[], Int32 ByRef, Int32 ByRef, Int32 ByRef, Boolean, Boolean)
at System.Diagnostics.Process.StartCore(System.Diagnostics.ProcessStartInfo)
at CoreclrTestLib.CoreclrTestWrapperLib.RunTest(System.String, System.String, System.String, System.String, System.String, System.String)
at TestLibrary.OutOfProcessTest.RunOutOfProcessTest(System.String)
at Program.<<Main>$>g__TestExecutor1|0_2(System.IO.StreamWriter, System.IO.StreamWriter, <>c__DisplayClass0_0 ByRef)
at Program.<Main>$(System.String[])
./Regressions.sh: line 444: 36140 Aborted $LAUNCHER $ExePath "${CLRTestExecutionArguments[@]}"
Expected: 100
Actual: 134
END EXECUTION - FAILED

The question is: how do I track down what is causing the 0x80004005 error? It seems I need to use lldb to get SOS functionality, and I'm not sure how to work with LLDB with multiple spawned processes as well as GCStress (so lots of "illegal" instructions). It seems that process handle --pass true --stop false --notify false SIGILL helps with GCStress, but I'm not sure how and where to stop when the actual interesting exception occurs.

Any suggestions?

@BruceForstallBruceForstall mentioned this pull request Jan 2, 2024
@janvorli

Copy link
Copy Markdown
Member

@BruceForstall I've just found that starting with LLDB 14, there is a setting to debug child processes - at fork, the debugger switches to the spawned process and continues debugging it. You can use the following LLDB command settings set target.process.follow-fork-mode child to enable that.

However, when debugging stuff in child process, I usually try to figure out the command line to run the child standalone so that I don't have to do anything special.

There is also an env variable BuildAsStandalone that you can set to true before building the tests. That causes the tests to be built the "old way" without multiple tests being merged". So, each test gets its own .sh. I find it useful in cases like this.

@janvorli

Copy link
Copy Markdown
Member

@BruceForstall I have tried to build your branch and build the tests with env var BuildAsStandalone=true. The baseservices/exceptions/unhandled/unhandledTester/unhandledTester.sh reproduces the issue in the main process, so you don't need to fiddle with child process debugging. Btw, with the GC stress, you'll also need to treat the SIGSEGV the same way as SIGILL, both are coming from the instrumentation.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Thanks! I'll go build with BuildAsStandalone=true.

@janvorli

Copy link
Copy Markdown
Member

I've also noticed that the issue occured on the first SIGILL, there were SIGSEGVs before that and they were processed ok. So just using process handle --pass true --stop false --notify false SIGSEGV will get the debugger break at the problematic spot.

@janvorli

Copy link
Copy Markdown
Member

It seems that the problem is actually that we only handle the STATUS_PRIVILEGED_INSTRUCTION as the GC stress instrumentation instruction exceptions. But the SIGILL generates STATUS_ILLEGAL_INSTRUCTION, which we don't process in any way, which explains the behavior.
The code looks like this:

 0x7fff792dcc2c: lock
0x7fff792dcc2d: hlt
0x7fff792dcc2e: movb $0x11, %cl
0x7fff792dcc30: hlt

My guess is that the "lock" is not expected there and may somehow stem from incorrect disassembly of the previous instruction when we instrument it.

@janvorli

janvorli commented Jan 2, 2024

Copy link
Copy Markdown
Member

Hmm, I guess this makes it clear:

(lldb) clru 0x7fff792dcc2c
Error: Failed to find runtime directory
Normal JIT generated code
System.Net.Sockets.SocketAsyncEventArgs.SetBuffer(System.Memory`1<Byte>)
ilAddr is 00007FFFF40DE8A8 pImport is 000000000140F570
Begin 00007FFF792DCC00, size 15e
00007fff792dcc00 55 push rbp
00007fff792dcc01 53 push rbx
00007fff792dcc02 4883ec28 sub rsp, 0x28
00007fff792dcc06 488d6c2430 lea rbp, [rsp + 0x30]
00007fff792dcc0b 488965d0 mov qword ptr [rbp - 0x30], rsp
00007fff792dcc0f 48897de0 mov qword ptr [rbp - 0x20], rdi
00007fff792dcc13 488975e8 mov qword ptr [rbp - 0x18], rsi
00007fff792dcc17 488955f0 mov qword ptr [rbp - 0x10], rdx
00007fff792dcc1b 40383f cmp byte ptr [rdi], dil
00007fff792dcc1e 488d8fac000000 lea rcx, [rdi + 0xac]
00007fff792dcc25 baffffffff mov edx, 0xffffffff
00007fff792dcc2a 33c0 xor eax, eax
>>> 00007fff792dcc2c f0 lock
00007fff`792dcc2d 0fb111 cmpxchg dword ptr [rcx], edx (gcstress)

Seems like we have skipped the lock and instrumented just the cmpxchg that the lock is part of.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Ah, interesting. The change here is that I've rebuilt coredistools with a current LLVM. That's the disassembler we're using for instrumenting during GCStress. Perhaps it has a bug disassembling "lock", or perhaps the VM needs to handle "lock" differently with the new disassembler?

@janvorli

Copy link
Copy Markdown
Member

One or the other may be true. Depends on whether the change in the coredistool / LLVM was intentional or not.

@BruceForstall
BruceForstallforce-pushed the UpdateCoredistoolsVersion branch from 5d807c0 to 235df7eCompareJanuary 3, 2024 04:34
@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

GCStress failures are #94393, #96364

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Thanks again for your help investigating.

There was code in coredistools to specially handle x86 prefixes, to work around an LLVM bug that didn't treat the prefixes as part of the prefixed instruction. I removed this code because it was written 7-8 years ago, and various information on the internet made it sound like the LLVM bug had been fixed. Apparently it has not been fixed, at least for lock. It is surprising that the problem only manifested on Linux and not Windows -- maybe we don't use lock on Windows?

In any case, I restored the removed code and everything looks good now.

@BruceForstallBruceForstall changed the title Update MicrosoftNETCoreCoreDisToolsVersion to 1.3.0Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0Jan 3, 2024
@BruceForstall
BruceForstallforce-pushed the UpdateCoredistoolsVersion branch from 235df7e to 5628601CompareJanuary 3, 2024 17:34
@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@jakobbotsch@kunalspathak @dotnet/jit-contrib PTAL

@kunalspathakkunalspathak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@BruceForstall
BruceForstall merged commit 9459844 into dotnet:mainJan 3, 2024
@BruceForstall
BruceForstall deleted the UpdateCoredistoolsVersion branch January 3, 2024 20:31
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Feb 3, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@BruceForstall@janvorli@kunalspathak
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0 - #96291

Merged
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:UpdateCoredistoolsVersion
Jan 3, 2024
Merged

Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0#96291
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:UpdateCoredistoolsVersion

Conversation

@BruceForstall

Copy link
Copy Markdown
Contributor

No description provided.

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Dec 23, 2023
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:BruceForstall
Assignees:BruceForstall
Labels:

area-CodeGen-coreclr

Milestone:-

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Can you help me figure out how to debug a problem with this change?

This PR updates coredistools.dll/so/dylib to a newly built version. This PR includes #96286, which has various related changes but doesn't bump the coredistools package version. That PR passes GCStress.

This PR fails on linux x64 GCStress (maybe others), apparently during tests which are run out of process, so are spawned. Swapping in an older coredistools succeeds.

For example (in my local WSL build/run):

export DOTNET_TieredCompilation=0
export DOTNET_GCStress=4
...
brucefo@Megatron:~/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Regressions/Regressions$ export CORE_ROOT=/home/brucefo/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Tests/Core_Root
brucefo@Megatron:~/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Regressions/Regressions$ ./Regressions.sh
BEGIN EXECUTION
/home/brucefo/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Tests/Core_Root/corerun -p System.Reflection.Metadata.MetadataUpdater.IsSupported=false -p System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization=true Regressions.dll ''
13:02:44.759 Running test: Regressions/coreclr/0041/expl_double_1/expl_double_1.cmd
Fatal error. System.Runtime.InteropServices.SEHException (0x80004005): External component has thrown an exception.
at System.Diagnostics.Process.ForkAndExecProcess(System.Diagnostics.ProcessStartInfo, System.String, System.String[], System.String[], System.String, Boolean, UInt32, UInt32, UInt32[], Int32 ByRef, Int32 ByRef, Int32 ByRef, Boolean, Boolean)
at System.Diagnostics.Process.StartCore(System.Diagnostics.ProcessStartInfo)
at CoreclrTestLib.CoreclrTestWrapperLib.RunTest(System.String, System.String, System.String, System.String, System.String, System.String)
at TestLibrary.OutOfProcessTest.RunOutOfProcessTest(System.String)
at Program.<<Main>$>g__TestExecutor1|0_2(System.IO.StreamWriter, System.IO.StreamWriter, <>c__DisplayClass0_0 ByRef)
at Program.<Main>$(System.String[])
./Regressions.sh: line 444: 36140 Aborted $LAUNCHER $ExePath "${CLRTestExecutionArguments[@]}"
Expected: 100
Actual: 134
END EXECUTION - FAILED

The question is: how do I track down what is causing the 0x80004005 error? It seems I need to use lldb to get SOS functionality, and I'm not sure how to work with LLDB with multiple spawned processes as well as GCStress (so lots of "illegal" instructions). It seems that process handle --pass true --stop false --notify false SIGILL helps with GCStress, but I'm not sure how and where to stop when the actual interesting exception occurs.

Any suggestions?

@BruceForstallBruceForstall mentioned this pull request Jan 2, 2024
@janvorli

Copy link
Copy Markdown
Member

@BruceForstall I've just found that starting with LLDB 14, there is a setting to debug child processes - at fork, the debugger switches to the spawned process and continues debugging it. You can use the following LLDB command settings set target.process.follow-fork-mode child to enable that.

However, when debugging stuff in child process, I usually try to figure out the command line to run the child standalone so that I don't have to do anything special.

There is also an env variable BuildAsStandalone that you can set to true before building the tests. That causes the tests to be built the "old way" without multiple tests being merged". So, each test gets its own .sh. I find it useful in cases like this.

@janvorli

Copy link
Copy Markdown
Member

@BruceForstall I have tried to build your branch and build the tests with env var BuildAsStandalone=true. The baseservices/exceptions/unhandled/unhandledTester/unhandledTester.sh reproduces the issue in the main process, so you don't need to fiddle with child process debugging. Btw, with the GC stress, you'll also need to treat the SIGSEGV the same way as SIGILL, both are coming from the instrumentation.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Thanks! I'll go build with BuildAsStandalone=true.

@janvorli

Copy link
Copy Markdown
Member

I've also noticed that the issue occured on the first SIGILL, there were SIGSEGVs before that and they were processed ok. So just using process handle --pass true --stop false --notify false SIGSEGV will get the debugger break at the problematic spot.

@janvorli

Copy link
Copy Markdown
Member

It seems that the problem is actually that we only handle the STATUS_PRIVILEGED_INSTRUCTION as the GC stress instrumentation instruction exceptions. But the SIGILL generates STATUS_ILLEGAL_INSTRUCTION, which we don't process in any way, which explains the behavior.
The code looks like this:

 0x7fff792dcc2c: lock
0x7fff792dcc2d: hlt
0x7fff792dcc2e: movb $0x11, %cl
0x7fff792dcc30: hlt

My guess is that the "lock" is not expected there and may somehow stem from incorrect disassembly of the previous instruction when we instrument it.

@janvorli

janvorli commented Jan 2, 2024

Copy link
Copy Markdown
Member

Hmm, I guess this makes it clear:

(lldb) clru 0x7fff792dcc2c
Error: Failed to find runtime directory
Normal JIT generated code
System.Net.Sockets.SocketAsyncEventArgs.SetBuffer(System.Memory`1<Byte>)
ilAddr is 00007FFFF40DE8A8 pImport is 000000000140F570
Begin 00007FFF792DCC00, size 15e
00007fff792dcc00 55 push rbp
00007fff792dcc01 53 push rbx
00007fff792dcc02 4883ec28 sub rsp, 0x28
00007fff792dcc06 488d6c2430 lea rbp, [rsp + 0x30]
00007fff792dcc0b 488965d0 mov qword ptr [rbp - 0x30], rsp
00007fff792dcc0f 48897de0 mov qword ptr [rbp - 0x20], rdi
00007fff792dcc13 488975e8 mov qword ptr [rbp - 0x18], rsi
00007fff792dcc17 488955f0 mov qword ptr [rbp - 0x10], rdx
00007fff792dcc1b 40383f cmp byte ptr [rdi], dil
00007fff792dcc1e 488d8fac000000 lea rcx, [rdi + 0xac]
00007fff792dcc25 baffffffff mov edx, 0xffffffff
00007fff792dcc2a 33c0 xor eax, eax
>>> 00007fff792dcc2c f0 lock
00007fff`792dcc2d 0fb111 cmpxchg dword ptr [rcx], edx (gcstress)

Seems like we have skipped the lock and instrumented just the cmpxchg that the lock is part of.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Ah, interesting. The change here is that I've rebuilt coredistools with a current LLVM. That's the disassembler we're using for instrumenting during GCStress. Perhaps it has a bug disassembling "lock", or perhaps the VM needs to handle "lock" differently with the new disassembler?

@janvorli

Copy link
Copy Markdown
Member

One or the other may be true. Depends on whether the change in the coredistool / LLVM was intentional or not.

@BruceForstall
BruceForstallforce-pushed the UpdateCoredistoolsVersion branch from 5d807c0 to 235df7eCompareJanuary 3, 2024 04:34
@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

GCStress failures are #94393, #96364

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Thanks again for your help investigating.

There was code in coredistools to specially handle x86 prefixes, to work around an LLVM bug that didn't treat the prefixes as part of the prefixed instruction. I removed this code because it was written 7-8 years ago, and various information on the internet made it sound like the LLVM bug had been fixed. Apparently it has not been fixed, at least for lock. It is surprising that the problem only manifested on Linux and not Windows -- maybe we don't use lock on Windows?

In any case, I restored the removed code and everything looks good now.

@BruceForstallBruceForstall changed the title Update MicrosoftNETCoreCoreDisToolsVersion to 1.3.0Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0Jan 3, 2024
@BruceForstall
BruceForstallforce-pushed the UpdateCoredistoolsVersion branch from 235df7e to 5628601CompareJanuary 3, 2024 17:34
@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@jakobbotsch@kunalspathak @dotnet/jit-contrib PTAL

@kunalspathakkunalspathak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@BruceForstall
BruceForstall merged commit 9459844 into dotnet:mainJan 3, 2024
@BruceForstall
BruceForstall deleted the UpdateCoredistoolsVersion branch January 3, 2024 20:31
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Feb 3, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@BruceForstall@janvorli@kunalspathak
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0 - #96291

Merged
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:UpdateCoredistoolsVersion
Jan 3, 2024
Merged

Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0#96291
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:UpdateCoredistoolsVersion

Conversation

@BruceForstall

Copy link
Copy Markdown
Contributor

No description provided.

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Dec 23, 2023
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:BruceForstall
Assignees:BruceForstall
Labels:

area-CodeGen-coreclr

Milestone:-

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Can you help me figure out how to debug a problem with this change?

This PR updates coredistools.dll/so/dylib to a newly built version. This PR includes #96286, which has various related changes but doesn't bump the coredistools package version. That PR passes GCStress.

This PR fails on linux x64 GCStress (maybe others), apparently during tests which are run out of process, so are spawned. Swapping in an older coredistools succeeds.

For example (in my local WSL build/run):

export DOTNET_TieredCompilation=0
export DOTNET_GCStress=4
...
brucefo@Megatron:~/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Regressions/Regressions$ export CORE_ROOT=/home/brucefo/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Tests/Core_Root
brucefo@Megatron:~/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Regressions/Regressions$ ./Regressions.sh
BEGIN EXECUTION
/home/brucefo/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Tests/Core_Root/corerun -p System.Reflection.Metadata.MetadataUpdater.IsSupported=false -p System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization=true Regressions.dll ''
13:02:44.759 Running test: Regressions/coreclr/0041/expl_double_1/expl_double_1.cmd
Fatal error. System.Runtime.InteropServices.SEHException (0x80004005): External component has thrown an exception.
at System.Diagnostics.Process.ForkAndExecProcess(System.Diagnostics.ProcessStartInfo, System.String, System.String[], System.String[], System.String, Boolean, UInt32, UInt32, UInt32[], Int32 ByRef, Int32 ByRef, Int32 ByRef, Boolean, Boolean)
at System.Diagnostics.Process.StartCore(System.Diagnostics.ProcessStartInfo)
at CoreclrTestLib.CoreclrTestWrapperLib.RunTest(System.String, System.String, System.String, System.String, System.String, System.String)
at TestLibrary.OutOfProcessTest.RunOutOfProcessTest(System.String)
at Program.<<Main>$>g__TestExecutor1|0_2(System.IO.StreamWriter, System.IO.StreamWriter, <>c__DisplayClass0_0 ByRef)
at Program.<Main>$(System.String[])
./Regressions.sh: line 444: 36140 Aborted $LAUNCHER $ExePath "${CLRTestExecutionArguments[@]}"
Expected: 100
Actual: 134
END EXECUTION - FAILED

The question is: how do I track down what is causing the 0x80004005 error? It seems I need to use lldb to get SOS functionality, and I'm not sure how to work with LLDB with multiple spawned processes as well as GCStress (so lots of "illegal" instructions). It seems that process handle --pass true --stop false --notify false SIGILL helps with GCStress, but I'm not sure how and where to stop when the actual interesting exception occurs.

Any suggestions?

@BruceForstallBruceForstall mentioned this pull request Jan 2, 2024
@janvorli

Copy link
Copy Markdown
Member

@BruceForstall I've just found that starting with LLDB 14, there is a setting to debug child processes - at fork, the debugger switches to the spawned process and continues debugging it. You can use the following LLDB command settings set target.process.follow-fork-mode child to enable that.

However, when debugging stuff in child process, I usually try to figure out the command line to run the child standalone so that I don't have to do anything special.

There is also an env variable BuildAsStandalone that you can set to true before building the tests. That causes the tests to be built the "old way" without multiple tests being merged". So, each test gets its own .sh. I find it useful in cases like this.

@janvorli

Copy link
Copy Markdown
Member

@BruceForstall I have tried to build your branch and build the tests with env var BuildAsStandalone=true. The baseservices/exceptions/unhandled/unhandledTester/unhandledTester.sh reproduces the issue in the main process, so you don't need to fiddle with child process debugging. Btw, with the GC stress, you'll also need to treat the SIGSEGV the same way as SIGILL, both are coming from the instrumentation.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Thanks! I'll go build with BuildAsStandalone=true.

@janvorli

Copy link
Copy Markdown
Member

I've also noticed that the issue occured on the first SIGILL, there were SIGSEGVs before that and they were processed ok. So just using process handle --pass true --stop false --notify false SIGSEGV will get the debugger break at the problematic spot.

@janvorli

Copy link
Copy Markdown
Member

It seems that the problem is actually that we only handle the STATUS_PRIVILEGED_INSTRUCTION as the GC stress instrumentation instruction exceptions. But the SIGILL generates STATUS_ILLEGAL_INSTRUCTION, which we don't process in any way, which explains the behavior.
The code looks like this:

 0x7fff792dcc2c: lock
0x7fff792dcc2d: hlt
0x7fff792dcc2e: movb $0x11, %cl
0x7fff792dcc30: hlt

My guess is that the "lock" is not expected there and may somehow stem from incorrect disassembly of the previous instruction when we instrument it.

@janvorli

janvorli commented Jan 2, 2024

Copy link
Copy Markdown
Member

Hmm, I guess this makes it clear:

(lldb) clru 0x7fff792dcc2c
Error: Failed to find runtime directory
Normal JIT generated code
System.Net.Sockets.SocketAsyncEventArgs.SetBuffer(System.Memory`1<Byte>)
ilAddr is 00007FFFF40DE8A8 pImport is 000000000140F570
Begin 00007FFF792DCC00, size 15e
00007fff792dcc00 55 push rbp
00007fff792dcc01 53 push rbx
00007fff792dcc02 4883ec28 sub rsp, 0x28
00007fff792dcc06 488d6c2430 lea rbp, [rsp + 0x30]
00007fff792dcc0b 488965d0 mov qword ptr [rbp - 0x30], rsp
00007fff792dcc0f 48897de0 mov qword ptr [rbp - 0x20], rdi
00007fff792dcc13 488975e8 mov qword ptr [rbp - 0x18], rsi
00007fff792dcc17 488955f0 mov qword ptr [rbp - 0x10], rdx
00007fff792dcc1b 40383f cmp byte ptr [rdi], dil
00007fff792dcc1e 488d8fac000000 lea rcx, [rdi + 0xac]
00007fff792dcc25 baffffffff mov edx, 0xffffffff
00007fff792dcc2a 33c0 xor eax, eax
>>> 00007fff792dcc2c f0 lock
00007fff`792dcc2d 0fb111 cmpxchg dword ptr [rcx], edx (gcstress)

Seems like we have skipped the lock and instrumented just the cmpxchg that the lock is part of.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Ah, interesting. The change here is that I've rebuilt coredistools with a current LLVM. That's the disassembler we're using for instrumenting during GCStress. Perhaps it has a bug disassembling "lock", or perhaps the VM needs to handle "lock" differently with the new disassembler?

@janvorli

Copy link
Copy Markdown
Member

One or the other may be true. Depends on whether the change in the coredistool / LLVM was intentional or not.

@BruceForstall
BruceForstallforce-pushed the UpdateCoredistoolsVersion branch from 5d807c0 to 235df7eCompareJanuary 3, 2024 04:34
@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

GCStress failures are #94393, #96364

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Thanks again for your help investigating.

There was code in coredistools to specially handle x86 prefixes, to work around an LLVM bug that didn't treat the prefixes as part of the prefixed instruction. I removed this code because it was written 7-8 years ago, and various information on the internet made it sound like the LLVM bug had been fixed. Apparently it has not been fixed, at least for lock. It is surprising that the problem only manifested on Linux and not Windows -- maybe we don't use lock on Windows?

In any case, I restored the removed code and everything looks good now.

@BruceForstallBruceForstall changed the title Update MicrosoftNETCoreCoreDisToolsVersion to 1.3.0Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0Jan 3, 2024
@BruceForstall
BruceForstallforce-pushed the UpdateCoredistoolsVersion branch from 235df7e to 5628601CompareJanuary 3, 2024 17:34
@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@jakobbotsch@kunalspathak @dotnet/jit-contrib PTAL

@kunalspathakkunalspathak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@BruceForstall
BruceForstall merged commit 9459844 into dotnet:mainJan 3, 2024
@BruceForstall
BruceForstall deleted the UpdateCoredistoolsVersion branch January 3, 2024 20:31
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Feb 3, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@BruceForstall@janvorli@kunalspathak
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0 - #96291

Merged
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:UpdateCoredistoolsVersion
Jan 3, 2024
Merged

Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0#96291
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:UpdateCoredistoolsVersion

Conversation

@BruceForstall

Copy link
Copy Markdown
Contributor

No description provided.

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Dec 23, 2023
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:BruceForstall
Assignees:BruceForstall
Labels:

area-CodeGen-coreclr

Milestone:-

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Can you help me figure out how to debug a problem with this change?

This PR updates coredistools.dll/so/dylib to a newly built version. This PR includes #96286, which has various related changes but doesn't bump the coredistools package version. That PR passes GCStress.

This PR fails on linux x64 GCStress (maybe others), apparently during tests which are run out of process, so are spawned. Swapping in an older coredistools succeeds.

For example (in my local WSL build/run):

export DOTNET_TieredCompilation=0
export DOTNET_GCStress=4
...
brucefo@Megatron:~/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Regressions/Regressions$ export CORE_ROOT=/home/brucefo/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Tests/Core_Root
brucefo@Megatron:~/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Regressions/Regressions$ ./Regressions.sh
BEGIN EXECUTION
/home/brucefo/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Tests/Core_Root/corerun -p System.Reflection.Metadata.MetadataUpdater.IsSupported=false -p System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization=true Regressions.dll ''
13:02:44.759 Running test: Regressions/coreclr/0041/expl_double_1/expl_double_1.cmd
Fatal error. System.Runtime.InteropServices.SEHException (0x80004005): External component has thrown an exception.
at System.Diagnostics.Process.ForkAndExecProcess(System.Diagnostics.ProcessStartInfo, System.String, System.String[], System.String[], System.String, Boolean, UInt32, UInt32, UInt32[], Int32 ByRef, Int32 ByRef, Int32 ByRef, Boolean, Boolean)
at System.Diagnostics.Process.StartCore(System.Diagnostics.ProcessStartInfo)
at CoreclrTestLib.CoreclrTestWrapperLib.RunTest(System.String, System.String, System.String, System.String, System.String, System.String)
at TestLibrary.OutOfProcessTest.RunOutOfProcessTest(System.String)
at Program.<<Main>$>g__TestExecutor1|0_2(System.IO.StreamWriter, System.IO.StreamWriter, <>c__DisplayClass0_0 ByRef)
at Program.<Main>$(System.String[])
./Regressions.sh: line 444: 36140 Aborted $LAUNCHER $ExePath "${CLRTestExecutionArguments[@]}"
Expected: 100
Actual: 134
END EXECUTION - FAILED

The question is: how do I track down what is causing the 0x80004005 error? It seems I need to use lldb to get SOS functionality, and I'm not sure how to work with LLDB with multiple spawned processes as well as GCStress (so lots of "illegal" instructions). It seems that process handle --pass true --stop false --notify false SIGILL helps with GCStress, but I'm not sure how and where to stop when the actual interesting exception occurs.

Any suggestions?

@BruceForstallBruceForstall mentioned this pull request Jan 2, 2024
@janvorli

Copy link
Copy Markdown
Member

@BruceForstall I've just found that starting with LLDB 14, there is a setting to debug child processes - at fork, the debugger switches to the spawned process and continues debugging it. You can use the following LLDB command settings set target.process.follow-fork-mode child to enable that.

However, when debugging stuff in child process, I usually try to figure out the command line to run the child standalone so that I don't have to do anything special.

There is also an env variable BuildAsStandalone that you can set to true before building the tests. That causes the tests to be built the "old way" without multiple tests being merged". So, each test gets its own .sh. I find it useful in cases like this.

@janvorli

Copy link
Copy Markdown
Member

@BruceForstall I have tried to build your branch and build the tests with env var BuildAsStandalone=true. The baseservices/exceptions/unhandled/unhandledTester/unhandledTester.sh reproduces the issue in the main process, so you don't need to fiddle with child process debugging. Btw, with the GC stress, you'll also need to treat the SIGSEGV the same way as SIGILL, both are coming from the instrumentation.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Thanks! I'll go build with BuildAsStandalone=true.

@janvorli

Copy link
Copy Markdown
Member

I've also noticed that the issue occured on the first SIGILL, there were SIGSEGVs before that and they were processed ok. So just using process handle --pass true --stop false --notify false SIGSEGV will get the debugger break at the problematic spot.

@janvorli

Copy link
Copy Markdown
Member

It seems that the problem is actually that we only handle the STATUS_PRIVILEGED_INSTRUCTION as the GC stress instrumentation instruction exceptions. But the SIGILL generates STATUS_ILLEGAL_INSTRUCTION, which we don't process in any way, which explains the behavior.
The code looks like this:

 0x7fff792dcc2c: lock
0x7fff792dcc2d: hlt
0x7fff792dcc2e: movb $0x11, %cl
0x7fff792dcc30: hlt

My guess is that the "lock" is not expected there and may somehow stem from incorrect disassembly of the previous instruction when we instrument it.

@janvorli

janvorli commented Jan 2, 2024

Copy link
Copy Markdown
Member

Hmm, I guess this makes it clear:

(lldb) clru 0x7fff792dcc2c
Error: Failed to find runtime directory
Normal JIT generated code
System.Net.Sockets.SocketAsyncEventArgs.SetBuffer(System.Memory`1<Byte>)
ilAddr is 00007FFFF40DE8A8 pImport is 000000000140F570
Begin 00007FFF792DCC00, size 15e
00007fff792dcc00 55 push rbp
00007fff792dcc01 53 push rbx
00007fff792dcc02 4883ec28 sub rsp, 0x28
00007fff792dcc06 488d6c2430 lea rbp, [rsp + 0x30]
00007fff792dcc0b 488965d0 mov qword ptr [rbp - 0x30], rsp
00007fff792dcc0f 48897de0 mov qword ptr [rbp - 0x20], rdi
00007fff792dcc13 488975e8 mov qword ptr [rbp - 0x18], rsi
00007fff792dcc17 488955f0 mov qword ptr [rbp - 0x10], rdx
00007fff792dcc1b 40383f cmp byte ptr [rdi], dil
00007fff792dcc1e 488d8fac000000 lea rcx, [rdi + 0xac]
00007fff792dcc25 baffffffff mov edx, 0xffffffff
00007fff792dcc2a 33c0 xor eax, eax
>>> 00007fff792dcc2c f0 lock
00007fff`792dcc2d 0fb111 cmpxchg dword ptr [rcx], edx (gcstress)

Seems like we have skipped the lock and instrumented just the cmpxchg that the lock is part of.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Ah, interesting. The change here is that I've rebuilt coredistools with a current LLVM. That's the disassembler we're using for instrumenting during GCStress. Perhaps it has a bug disassembling "lock", or perhaps the VM needs to handle "lock" differently with the new disassembler?

@janvorli

Copy link
Copy Markdown
Member

One or the other may be true. Depends on whether the change in the coredistool / LLVM was intentional or not.

@BruceForstall
BruceForstallforce-pushed the UpdateCoredistoolsVersion branch from 5d807c0 to 235df7eCompareJanuary 3, 2024 04:34
@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

GCStress failures are #94393, #96364

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Thanks again for your help investigating.

There was code in coredistools to specially handle x86 prefixes, to work around an LLVM bug that didn't treat the prefixes as part of the prefixed instruction. I removed this code because it was written 7-8 years ago, and various information on the internet made it sound like the LLVM bug had been fixed. Apparently it has not been fixed, at least for lock. It is surprising that the problem only manifested on Linux and not Windows -- maybe we don't use lock on Windows?

In any case, I restored the removed code and everything looks good now.

@BruceForstallBruceForstall changed the title Update MicrosoftNETCoreCoreDisToolsVersion to 1.3.0Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0Jan 3, 2024
@BruceForstall
BruceForstallforce-pushed the UpdateCoredistoolsVersion branch from 235df7e to 5628601CompareJanuary 3, 2024 17:34
@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@jakobbotsch@kunalspathak @dotnet/jit-contrib PTAL

@kunalspathakkunalspathak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@BruceForstall
BruceForstall merged commit 9459844 into dotnet:mainJan 3, 2024
@BruceForstall
BruceForstall deleted the UpdateCoredistoolsVersion branch January 3, 2024 20:31
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Feb 3, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@BruceForstall@janvorli@kunalspathak
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0 - #96291

Merged
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:UpdateCoredistoolsVersion
Jan 3, 2024
Merged

Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0#96291
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:UpdateCoredistoolsVersion

Conversation

@BruceForstall

Copy link
Copy Markdown
Contributor

No description provided.

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Dec 23, 2023
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:BruceForstall
Assignees:BruceForstall
Labels:

area-CodeGen-coreclr

Milestone:-

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Can you help me figure out how to debug a problem with this change?

This PR updates coredistools.dll/so/dylib to a newly built version. This PR includes #96286, which has various related changes but doesn't bump the coredistools package version. That PR passes GCStress.

This PR fails on linux x64 GCStress (maybe others), apparently during tests which are run out of process, so are spawned. Swapping in an older coredistools succeeds.

For example (in my local WSL build/run):

export DOTNET_TieredCompilation=0
export DOTNET_GCStress=4
...
brucefo@Megatron:~/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Regressions/Regressions$ export CORE_ROOT=/home/brucefo/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Tests/Core_Root
brucefo@Megatron:~/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Regressions/Regressions$ ./Regressions.sh
BEGIN EXECUTION
/home/brucefo/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Tests/Core_Root/corerun -p System.Reflection.Metadata.MetadataUpdater.IsSupported=false -p System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization=true Regressions.dll ''
13:02:44.759 Running test: Regressions/coreclr/0041/expl_double_1/expl_double_1.cmd
Fatal error. System.Runtime.InteropServices.SEHException (0x80004005): External component has thrown an exception.
at System.Diagnostics.Process.ForkAndExecProcess(System.Diagnostics.ProcessStartInfo, System.String, System.String[], System.String[], System.String, Boolean, UInt32, UInt32, UInt32[], Int32 ByRef, Int32 ByRef, Int32 ByRef, Boolean, Boolean)
at System.Diagnostics.Process.StartCore(System.Diagnostics.ProcessStartInfo)
at CoreclrTestLib.CoreclrTestWrapperLib.RunTest(System.String, System.String, System.String, System.String, System.String, System.String)
at TestLibrary.OutOfProcessTest.RunOutOfProcessTest(System.String)
at Program.<<Main>$>g__TestExecutor1|0_2(System.IO.StreamWriter, System.IO.StreamWriter, <>c__DisplayClass0_0 ByRef)
at Program.<Main>$(System.String[])
./Regressions.sh: line 444: 36140 Aborted $LAUNCHER $ExePath "${CLRTestExecutionArguments[@]}"
Expected: 100
Actual: 134
END EXECUTION - FAILED

The question is: how do I track down what is causing the 0x80004005 error? It seems I need to use lldb to get SOS functionality, and I'm not sure how to work with LLDB with multiple spawned processes as well as GCStress (so lots of "illegal" instructions). It seems that process handle --pass true --stop false --notify false SIGILL helps with GCStress, but I'm not sure how and where to stop when the actual interesting exception occurs.

Any suggestions?

@BruceForstallBruceForstall mentioned this pull request Jan 2, 2024
@janvorli

Copy link
Copy Markdown
Member

@BruceForstall I've just found that starting with LLDB 14, there is a setting to debug child processes - at fork, the debugger switches to the spawned process and continues debugging it. You can use the following LLDB command settings set target.process.follow-fork-mode child to enable that.

However, when debugging stuff in child process, I usually try to figure out the command line to run the child standalone so that I don't have to do anything special.

There is also an env variable BuildAsStandalone that you can set to true before building the tests. That causes the tests to be built the "old way" without multiple tests being merged". So, each test gets its own .sh. I find it useful in cases like this.

@janvorli

Copy link
Copy Markdown
Member

@BruceForstall I have tried to build your branch and build the tests with env var BuildAsStandalone=true. The baseservices/exceptions/unhandled/unhandledTester/unhandledTester.sh reproduces the issue in the main process, so you don't need to fiddle with child process debugging. Btw, with the GC stress, you'll also need to treat the SIGSEGV the same way as SIGILL, both are coming from the instrumentation.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Thanks! I'll go build with BuildAsStandalone=true.

@janvorli

Copy link
Copy Markdown
Member

I've also noticed that the issue occured on the first SIGILL, there were SIGSEGVs before that and they were processed ok. So just using process handle --pass true --stop false --notify false SIGSEGV will get the debugger break at the problematic spot.

@janvorli

Copy link
Copy Markdown
Member

It seems that the problem is actually that we only handle the STATUS_PRIVILEGED_INSTRUCTION as the GC stress instrumentation instruction exceptions. But the SIGILL generates STATUS_ILLEGAL_INSTRUCTION, which we don't process in any way, which explains the behavior.
The code looks like this:

 0x7fff792dcc2c: lock
0x7fff792dcc2d: hlt
0x7fff792dcc2e: movb $0x11, %cl
0x7fff792dcc30: hlt

My guess is that the "lock" is not expected there and may somehow stem from incorrect disassembly of the previous instruction when we instrument it.

@janvorli

janvorli commented Jan 2, 2024

Copy link
Copy Markdown
Member

Hmm, I guess this makes it clear:

(lldb) clru 0x7fff792dcc2c
Error: Failed to find runtime directory
Normal JIT generated code
System.Net.Sockets.SocketAsyncEventArgs.SetBuffer(System.Memory`1<Byte>)
ilAddr is 00007FFFF40DE8A8 pImport is 000000000140F570
Begin 00007FFF792DCC00, size 15e
00007fff792dcc00 55 push rbp
00007fff792dcc01 53 push rbx
00007fff792dcc02 4883ec28 sub rsp, 0x28
00007fff792dcc06 488d6c2430 lea rbp, [rsp + 0x30]
00007fff792dcc0b 488965d0 mov qword ptr [rbp - 0x30], rsp
00007fff792dcc0f 48897de0 mov qword ptr [rbp - 0x20], rdi
00007fff792dcc13 488975e8 mov qword ptr [rbp - 0x18], rsi
00007fff792dcc17 488955f0 mov qword ptr [rbp - 0x10], rdx
00007fff792dcc1b 40383f cmp byte ptr [rdi], dil
00007fff792dcc1e 488d8fac000000 lea rcx, [rdi + 0xac]
00007fff792dcc25 baffffffff mov edx, 0xffffffff
00007fff792dcc2a 33c0 xor eax, eax
>>> 00007fff792dcc2c f0 lock
00007fff`792dcc2d 0fb111 cmpxchg dword ptr [rcx], edx (gcstress)

Seems like we have skipped the lock and instrumented just the cmpxchg that the lock is part of.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Ah, interesting. The change here is that I've rebuilt coredistools with a current LLVM. That's the disassembler we're using for instrumenting during GCStress. Perhaps it has a bug disassembling "lock", or perhaps the VM needs to handle "lock" differently with the new disassembler?

@janvorli

Copy link
Copy Markdown
Member

One or the other may be true. Depends on whether the change in the coredistool / LLVM was intentional or not.

@BruceForstall
BruceForstallforce-pushed the UpdateCoredistoolsVersion branch from 5d807c0 to 235df7eCompareJanuary 3, 2024 04:34
@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

GCStress failures are #94393, #96364

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Thanks again for your help investigating.

There was code in coredistools to specially handle x86 prefixes, to work around an LLVM bug that didn't treat the prefixes as part of the prefixed instruction. I removed this code because it was written 7-8 years ago, and various information on the internet made it sound like the LLVM bug had been fixed. Apparently it has not been fixed, at least for lock. It is surprising that the problem only manifested on Linux and not Windows -- maybe we don't use lock on Windows?

In any case, I restored the removed code and everything looks good now.

@BruceForstallBruceForstall changed the title Update MicrosoftNETCoreCoreDisToolsVersion to 1.3.0Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0Jan 3, 2024
@BruceForstall
BruceForstallforce-pushed the UpdateCoredistoolsVersion branch from 235df7e to 5628601CompareJanuary 3, 2024 17:34
@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@jakobbotsch@kunalspathak @dotnet/jit-contrib PTAL

@kunalspathakkunalspathak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@BruceForstall
BruceForstall merged commit 9459844 into dotnet:mainJan 3, 2024
@BruceForstall
BruceForstall deleted the UpdateCoredistoolsVersion branch January 3, 2024 20:31
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Feb 3, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@BruceForstall@janvorli@kunalspathak
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0 - #96291

Merged
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:UpdateCoredistoolsVersion
Jan 3, 2024
Merged

Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0#96291
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:UpdateCoredistoolsVersion

Conversation

@BruceForstall

Copy link
Copy Markdown
Contributor

No description provided.

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Dec 23, 2023
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:BruceForstall
Assignees:BruceForstall
Labels:

area-CodeGen-coreclr

Milestone:-

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Can you help me figure out how to debug a problem with this change?

This PR updates coredistools.dll/so/dylib to a newly built version. This PR includes #96286, which has various related changes but doesn't bump the coredistools package version. That PR passes GCStress.

This PR fails on linux x64 GCStress (maybe others), apparently during tests which are run out of process, so are spawned. Swapping in an older coredistools succeeds.

For example (in my local WSL build/run):

export DOTNET_TieredCompilation=0
export DOTNET_GCStress=4
...
brucefo@Megatron:~/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Regressions/Regressions$ export CORE_ROOT=/home/brucefo/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Tests/Core_Root
brucefo@Megatron:~/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Regressions/Regressions$ ./Regressions.sh
BEGIN EXECUTION
/home/brucefo/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Tests/Core_Root/corerun -p System.Reflection.Metadata.MetadataUpdater.IsSupported=false -p System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization=true Regressions.dll ''
13:02:44.759 Running test: Regressions/coreclr/0041/expl_double_1/expl_double_1.cmd
Fatal error. System.Runtime.InteropServices.SEHException (0x80004005): External component has thrown an exception.
at System.Diagnostics.Process.ForkAndExecProcess(System.Diagnostics.ProcessStartInfo, System.String, System.String[], System.String[], System.String, Boolean, UInt32, UInt32, UInt32[], Int32 ByRef, Int32 ByRef, Int32 ByRef, Boolean, Boolean)
at System.Diagnostics.Process.StartCore(System.Diagnostics.ProcessStartInfo)
at CoreclrTestLib.CoreclrTestWrapperLib.RunTest(System.String, System.String, System.String, System.String, System.String, System.String)
at TestLibrary.OutOfProcessTest.RunOutOfProcessTest(System.String)
at Program.<<Main>$>g__TestExecutor1|0_2(System.IO.StreamWriter, System.IO.StreamWriter, <>c__DisplayClass0_0 ByRef)
at Program.<Main>$(System.String[])
./Regressions.sh: line 444: 36140 Aborted $LAUNCHER $ExePath "${CLRTestExecutionArguments[@]}"
Expected: 100
Actual: 134
END EXECUTION - FAILED

The question is: how do I track down what is causing the 0x80004005 error? It seems I need to use lldb to get SOS functionality, and I'm not sure how to work with LLDB with multiple spawned processes as well as GCStress (so lots of "illegal" instructions). It seems that process handle --pass true --stop false --notify false SIGILL helps with GCStress, but I'm not sure how and where to stop when the actual interesting exception occurs.

Any suggestions?

@BruceForstallBruceForstall mentioned this pull request Jan 2, 2024
@janvorli

Copy link
Copy Markdown
Member

@BruceForstall I've just found that starting with LLDB 14, there is a setting to debug child processes - at fork, the debugger switches to the spawned process and continues debugging it. You can use the following LLDB command settings set target.process.follow-fork-mode child to enable that.

However, when debugging stuff in child process, I usually try to figure out the command line to run the child standalone so that I don't have to do anything special.

There is also an env variable BuildAsStandalone that you can set to true before building the tests. That causes the tests to be built the "old way" without multiple tests being merged". So, each test gets its own .sh. I find it useful in cases like this.

@janvorli

Copy link
Copy Markdown
Member

@BruceForstall I have tried to build your branch and build the tests with env var BuildAsStandalone=true. The baseservices/exceptions/unhandled/unhandledTester/unhandledTester.sh reproduces the issue in the main process, so you don't need to fiddle with child process debugging. Btw, with the GC stress, you'll also need to treat the SIGSEGV the same way as SIGILL, both are coming from the instrumentation.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Thanks! I'll go build with BuildAsStandalone=true.

@janvorli

Copy link
Copy Markdown
Member

I've also noticed that the issue occured on the first SIGILL, there were SIGSEGVs before that and they were processed ok. So just using process handle --pass true --stop false --notify false SIGSEGV will get the debugger break at the problematic spot.

@janvorli

Copy link
Copy Markdown
Member

It seems that the problem is actually that we only handle the STATUS_PRIVILEGED_INSTRUCTION as the GC stress instrumentation instruction exceptions. But the SIGILL generates STATUS_ILLEGAL_INSTRUCTION, which we don't process in any way, which explains the behavior.
The code looks like this:

 0x7fff792dcc2c: lock
0x7fff792dcc2d: hlt
0x7fff792dcc2e: movb $0x11, %cl
0x7fff792dcc30: hlt

My guess is that the "lock" is not expected there and may somehow stem from incorrect disassembly of the previous instruction when we instrument it.

@janvorli

janvorli commented Jan 2, 2024

Copy link
Copy Markdown
Member

Hmm, I guess this makes it clear:

(lldb) clru 0x7fff792dcc2c
Error: Failed to find runtime directory
Normal JIT generated code
System.Net.Sockets.SocketAsyncEventArgs.SetBuffer(System.Memory`1<Byte>)
ilAddr is 00007FFFF40DE8A8 pImport is 000000000140F570
Begin 00007FFF792DCC00, size 15e
00007fff792dcc00 55 push rbp
00007fff792dcc01 53 push rbx
00007fff792dcc02 4883ec28 sub rsp, 0x28
00007fff792dcc06 488d6c2430 lea rbp, [rsp + 0x30]
00007fff792dcc0b 488965d0 mov qword ptr [rbp - 0x30], rsp
00007fff792dcc0f 48897de0 mov qword ptr [rbp - 0x20], rdi
00007fff792dcc13 488975e8 mov qword ptr [rbp - 0x18], rsi
00007fff792dcc17 488955f0 mov qword ptr [rbp - 0x10], rdx
00007fff792dcc1b 40383f cmp byte ptr [rdi], dil
00007fff792dcc1e 488d8fac000000 lea rcx, [rdi + 0xac]
00007fff792dcc25 baffffffff mov edx, 0xffffffff
00007fff792dcc2a 33c0 xor eax, eax
>>> 00007fff792dcc2c f0 lock
00007fff`792dcc2d 0fb111 cmpxchg dword ptr [rcx], edx (gcstress)

Seems like we have skipped the lock and instrumented just the cmpxchg that the lock is part of.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Ah, interesting. The change here is that I've rebuilt coredistools with a current LLVM. That's the disassembler we're using for instrumenting during GCStress. Perhaps it has a bug disassembling "lock", or perhaps the VM needs to handle "lock" differently with the new disassembler?

@janvorli

Copy link
Copy Markdown
Member

One or the other may be true. Depends on whether the change in the coredistool / LLVM was intentional or not.

@BruceForstall
BruceForstallforce-pushed the UpdateCoredistoolsVersion branch from 5d807c0 to 235df7eCompareJanuary 3, 2024 04:34
@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

GCStress failures are #94393, #96364

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Thanks again for your help investigating.

There was code in coredistools to specially handle x86 prefixes, to work around an LLVM bug that didn't treat the prefixes as part of the prefixed instruction. I removed this code because it was written 7-8 years ago, and various information on the internet made it sound like the LLVM bug had been fixed. Apparently it has not been fixed, at least for lock. It is surprising that the problem only manifested on Linux and not Windows -- maybe we don't use lock on Windows?

In any case, I restored the removed code and everything looks good now.

@BruceForstallBruceForstall changed the title Update MicrosoftNETCoreCoreDisToolsVersion to 1.3.0Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0Jan 3, 2024
@BruceForstall
BruceForstallforce-pushed the UpdateCoredistoolsVersion branch from 235df7e to 5628601CompareJanuary 3, 2024 17:34
@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@jakobbotsch@kunalspathak @dotnet/jit-contrib PTAL

@kunalspathakkunalspathak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@BruceForstall
BruceForstall merged commit 9459844 into dotnet:mainJan 3, 2024
@BruceForstall
BruceForstall deleted the UpdateCoredistoolsVersion branch January 3, 2024 20:31
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Feb 3, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@BruceForstall@janvorli@kunalspathak
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0 - #96291

Merged
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:UpdateCoredistoolsVersion
Jan 3, 2024
Merged

Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0#96291
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:UpdateCoredistoolsVersion

Conversation

@BruceForstall

Copy link
Copy Markdown
Contributor

No description provided.

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Dec 23, 2023
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:BruceForstall
Assignees:BruceForstall
Labels:

area-CodeGen-coreclr

Milestone:-

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Can you help me figure out how to debug a problem with this change?

This PR updates coredistools.dll/so/dylib to a newly built version. This PR includes #96286, which has various related changes but doesn't bump the coredistools package version. That PR passes GCStress.

This PR fails on linux x64 GCStress (maybe others), apparently during tests which are run out of process, so are spawned. Swapping in an older coredistools succeeds.

For example (in my local WSL build/run):

export DOTNET_TieredCompilation=0
export DOTNET_GCStress=4
...
brucefo@Megatron:~/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Regressions/Regressions$ export CORE_ROOT=/home/brucefo/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Tests/Core_Root
brucefo@Megatron:~/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Regressions/Regressions$ ./Regressions.sh
BEGIN EXECUTION
/home/brucefo/gh/runtime/artifacts/tests/coreclr/linux.x64.Checked/Tests/Core_Root/corerun -p System.Reflection.Metadata.MetadataUpdater.IsSupported=false -p System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization=true Regressions.dll ''
13:02:44.759 Running test: Regressions/coreclr/0041/expl_double_1/expl_double_1.cmd
Fatal error. System.Runtime.InteropServices.SEHException (0x80004005): External component has thrown an exception.
at System.Diagnostics.Process.ForkAndExecProcess(System.Diagnostics.ProcessStartInfo, System.String, System.String[], System.String[], System.String, Boolean, UInt32, UInt32, UInt32[], Int32 ByRef, Int32 ByRef, Int32 ByRef, Boolean, Boolean)
at System.Diagnostics.Process.StartCore(System.Diagnostics.ProcessStartInfo)
at CoreclrTestLib.CoreclrTestWrapperLib.RunTest(System.String, System.String, System.String, System.String, System.String, System.String)
at TestLibrary.OutOfProcessTest.RunOutOfProcessTest(System.String)
at Program.<<Main>$>g__TestExecutor1|0_2(System.IO.StreamWriter, System.IO.StreamWriter, <>c__DisplayClass0_0 ByRef)
at Program.<Main>$(System.String[])
./Regressions.sh: line 444: 36140 Aborted $LAUNCHER $ExePath "${CLRTestExecutionArguments[@]}"
Expected: 100
Actual: 134
END EXECUTION - FAILED

The question is: how do I track down what is causing the 0x80004005 error? It seems I need to use lldb to get SOS functionality, and I'm not sure how to work with LLDB with multiple spawned processes as well as GCStress (so lots of "illegal" instructions). It seems that process handle --pass true --stop false --notify false SIGILL helps with GCStress, but I'm not sure how and where to stop when the actual interesting exception occurs.

Any suggestions?

@BruceForstallBruceForstall mentioned this pull request Jan 2, 2024
@janvorli

Copy link
Copy Markdown
Member

@BruceForstall I've just found that starting with LLDB 14, there is a setting to debug child processes - at fork, the debugger switches to the spawned process and continues debugging it. You can use the following LLDB command settings set target.process.follow-fork-mode child to enable that.

However, when debugging stuff in child process, I usually try to figure out the command line to run the child standalone so that I don't have to do anything special.

There is also an env variable BuildAsStandalone that you can set to true before building the tests. That causes the tests to be built the "old way" without multiple tests being merged". So, each test gets its own .sh. I find it useful in cases like this.

@janvorli

Copy link
Copy Markdown
Member

@BruceForstall I have tried to build your branch and build the tests with env var BuildAsStandalone=true. The baseservices/exceptions/unhandled/unhandledTester/unhandledTester.sh reproduces the issue in the main process, so you don't need to fiddle with child process debugging. Btw, with the GC stress, you'll also need to treat the SIGSEGV the same way as SIGILL, both are coming from the instrumentation.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Thanks! I'll go build with BuildAsStandalone=true.

@janvorli

Copy link
Copy Markdown
Member

I've also noticed that the issue occured on the first SIGILL, there were SIGSEGVs before that and they were processed ok. So just using process handle --pass true --stop false --notify false SIGSEGV will get the debugger break at the problematic spot.

@janvorli

Copy link
Copy Markdown
Member

It seems that the problem is actually that we only handle the STATUS_PRIVILEGED_INSTRUCTION as the GC stress instrumentation instruction exceptions. But the SIGILL generates STATUS_ILLEGAL_INSTRUCTION, which we don't process in any way, which explains the behavior.
The code looks like this:

 0x7fff792dcc2c: lock
0x7fff792dcc2d: hlt
0x7fff792dcc2e: movb $0x11, %cl
0x7fff792dcc30: hlt

My guess is that the "lock" is not expected there and may somehow stem from incorrect disassembly of the previous instruction when we instrument it.

@janvorli

janvorli commented Jan 2, 2024

Copy link
Copy Markdown
Member

Hmm, I guess this makes it clear:

(lldb) clru 0x7fff792dcc2c
Error: Failed to find runtime directory
Normal JIT generated code
System.Net.Sockets.SocketAsyncEventArgs.SetBuffer(System.Memory`1<Byte>)
ilAddr is 00007FFFF40DE8A8 pImport is 000000000140F570
Begin 00007FFF792DCC00, size 15e
00007fff792dcc00 55 push rbp
00007fff792dcc01 53 push rbx
00007fff792dcc02 4883ec28 sub rsp, 0x28
00007fff792dcc06 488d6c2430 lea rbp, [rsp + 0x30]
00007fff792dcc0b 488965d0 mov qword ptr [rbp - 0x30], rsp
00007fff792dcc0f 48897de0 mov qword ptr [rbp - 0x20], rdi
00007fff792dcc13 488975e8 mov qword ptr [rbp - 0x18], rsi
00007fff792dcc17 488955f0 mov qword ptr [rbp - 0x10], rdx
00007fff792dcc1b 40383f cmp byte ptr [rdi], dil
00007fff792dcc1e 488d8fac000000 lea rcx, [rdi + 0xac]
00007fff792dcc25 baffffffff mov edx, 0xffffffff
00007fff792dcc2a 33c0 xor eax, eax
>>> 00007fff792dcc2c f0 lock
00007fff`792dcc2d 0fb111 cmpxchg dword ptr [rcx], edx (gcstress)

Seems like we have skipped the lock and instrumented just the cmpxchg that the lock is part of.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Ah, interesting. The change here is that I've rebuilt coredistools with a current LLVM. That's the disassembler we're using for instrumenting during GCStress. Perhaps it has a bug disassembling "lock", or perhaps the VM needs to handle "lock" differently with the new disassembler?

@janvorli

Copy link
Copy Markdown
Member

One or the other may be true. Depends on whether the change in the coredistool / LLVM was intentional or not.

@BruceForstall
BruceForstallforce-pushed the UpdateCoredistoolsVersion branch from 5d807c0 to 235df7eCompareJanuary 3, 2024 04:34
@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr gcstress0x3-gcstress0xc, runtime-coreclr superpmi-diffs, runtime-coreclr r2r

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 4 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

GCStress failures are #94393, #96364

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@janvorli Thanks again for your help investigating.

There was code in coredistools to specially handle x86 prefixes, to work around an LLVM bug that didn't treat the prefixes as part of the prefixed instruction. I removed this code because it was written 7-8 years ago, and various information on the internet made it sound like the LLVM bug had been fixed. Apparently it has not been fixed, at least for lock. It is surprising that the problem only manifested on Linux and not Windows -- maybe we don't use lock on Windows?

In any case, I restored the removed code and everything looks good now.

@BruceForstallBruceForstall changed the title Update MicrosoftNETCoreCoreDisToolsVersion to 1.3.0Update MicrosoftNETCoreCoreDisToolsVersion to 1.4.0Jan 3, 2024
@BruceForstall
BruceForstallforce-pushed the UpdateCoredistoolsVersion branch from 235df7e to 5628601CompareJanuary 3, 2024 17:34
@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@jakobbotsch@kunalspathak @dotnet/jit-contrib PTAL

@kunalspathakkunalspathak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@BruceForstall
BruceForstall merged commit 9459844 into dotnet:mainJan 3, 2024
@BruceForstall
BruceForstall deleted the UpdateCoredistoolsVersion branch January 3, 2024 20:31
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Feb 3, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@BruceForstall@janvorli@kunalspathak