From 9abbcb4b2a8f2cca37327c654b09300970c3de59 Mon Sep 17 00:00:00 2001 From: Adeel Mujahid <3840695+am11@users.noreply.github.com> Date: Wed, 10 Jun 2026 21:58:15 +0300 Subject: [PATCH 1/6] Fix illumox-x64 build with gcc and clang --- eng/native/configurecompiler.cmake | 19 ++++++++++++------ src/coreclr/gc/unix/gcenv.unix.cpp | 2 +- src/coreclr/jit/async.cpp | 10 +++++----- src/coreclr/jit/gentree.cpp | 2 +- src/coreclr/jit/gentree.h | 4 ++-- src/coreclr/jit/importercalls.cpp | 8 ++++---- src/coreclr/jit/lclmorph.cpp | 4 ++-- src/coreclr/jit/morph.cpp | 2 +- src/coreclr/jit/valuenum.cpp | 4 ++-- src/native/libs/System.Native/pal_io.c | 8 ++++---- src/native/libs/System.Native/pal_process.c | 12 +++++++++-- src/native/libs/System.Native/pal_signal.c | 20 ++++++++++++++----- src/native/libs/System.Native/pal_threading.c | 11 ---------- src/native/libs/System.Native/pal_time.c | 2 +- src/native/libs/System.Native/pal_uid.c | 2 +- 15 files changed, 62 insertions(+), 48 deletions(-) diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index 656a853f44ab75..ee9d2b574c543d 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -336,7 +336,12 @@ elseif(CLR_CMAKE_HOST_OPENBSD) # The PAL's hand-written asm lacks endbr64 landing pads, so disable branch-target CFI. add_linker_flag("-Wl,-z,nobtcfi") elseif(CLR_CMAKE_HOST_SUNOS) - add_compile_options($<$:-Wa,--noexecstack>) + # llvm's assembler crashes with noexecstack with solaris triplet; + # bug report with minimal repro at: https://github.com/llvm/llvm-project/issues/202953 + if (CMAKE_C_COMPILER_ID MATCHES "GNU") + add_compile_options($<$:-Wa,--noexecstack>) + endif() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector") add_definitions(-D__EXTENSIONS__ -D_XPG4_2 -D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT) @@ -382,15 +387,17 @@ elseif(CLR_CMAKE_HOST_HAIKU) set(CMAKE_LINK_LIBRARY_USING_WHOLE_ARCHIVE_SUPPORTED TRUE) set(CMAKE_LINK_LIBRARY_WHOLE_ARCHIVE_ATTRIBUTES LIBRARY_TYPE=STATIC DEDUPLICATION=YES OVERRIDE=DEFAULT) endif() - # Haiku uses the GNU toolchain, which supports RESCAN, but only CMake 4.4.0+ recognizes this. - if(CMAKE_VERSION VERSION_LESS 4.4) - set(CMAKE_LINK_GROUP_USING_RESCAN "LINKER:--start-group" "LINKER:--end-group") - set(CMAKE_LINK_GROUP_USING_RESCAN_SUPPORTED TRUE) - endif() + add_compile_options($<$:-Wa,--noexecstack>) add_linker_flag("-Wl,--build-id=sha1") endif() +if((CLR_CMAKE_HOST_HAIKU OR CLR_CMAKE_HOST_SUNOS) AND CMAKE_VERSION VERSION_LESS 4.4) + # Haiku and illumos uses the GNU toolchain, which supports RESCAN, but only CMake 4.4.0+ recognizes this. + set(CMAKE_LINK_GROUP_USING_RESCAN "LINKER:--start-group" "LINKER:--end-group") + set(CMAKE_LINK_GROUP_USING_RESCAN_SUPPORTED TRUE) +endif() + #------------------------------------ # Definitions (for platform) #----------------------------------- diff --git a/src/coreclr/gc/unix/gcenv.unix.cpp b/src/coreclr/gc/unix/gcenv.unix.cpp index 427aecd42e3de1..139c9da65330ee 100644 --- a/src/coreclr/gc/unix/gcenv.unix.cpp +++ b/src/coreclr/gc/unix/gcenv.unix.cpp @@ -568,7 +568,7 @@ bool GCToOSInterface::VirtualReset(void * address, size_t size, bool unlock) st = madvise(address, size, MADV_DONTDUMP); #endif -#ifdef MADV_FREE +#if defined(MADV_FREE) && !defined(TARGET_SUNOS) // Tell the kernel that the application doesn't need the pages in the range. // Freeing the pages can be delayed until a memory pressure occurs. st = madvise(address, size, MADV_FREE); diff --git a/src/coreclr/jit/async.cpp b/src/coreclr/jit/async.cpp index df2abfb88f5df7..d2815a57f0cff4 100644 --- a/src/coreclr/jit/async.cpp +++ b/src/coreclr/jit/async.cpp @@ -1331,7 +1331,7 @@ void AsyncTransformation::BuildContinuation(BasicBlock* block, block->getTryIndex()); } - if (call->GetAsyncInfo().ContinuationContextHandling == ContinuationContextHandling::ContinueOnCapturedContext) + if (call->GetAsyncInfo().ContextHandling == ContinuationContextHandling::ContinueOnCapturedContext) { layoutBuilder->SetNeedsContinuationContext(); JITDUMP(" Continuation continues on captured context; continuation will have context\n"); @@ -1899,10 +1899,10 @@ bool AsyncTransformation::IsReusableSuspension(const AsyncState* state, const AsyncCallInfo& asyncInfoThis = call->GetAsyncInfo(); const AsyncCallInfo& asyncInfoOther = predAsyncCall->AsCall()->GetAsyncInfo(); - if (asyncInfoThis.ContinuationContextHandling != asyncInfoOther.ContinuationContextHandling) + if (asyncInfoThis.ContextHandling != asyncInfoOther.ContextHandling) { JITDUMP(" No; disagreement on continuation context handling (%u vs %u)\n", - asyncInfoThis.ContinuationContextHandling, asyncInfoOther.ContinuationContextHandling); + asyncInfoThis.ContextHandling, asyncInfoOther.ContextHandling); return false; } @@ -2212,7 +2212,7 @@ void AsyncTransformation::CreateSuspension(BasicBlock* call CORINFO_CONTINUATION_RESULT_INDEX_NUM_BITS); } - if (callInfo.ContinuationContextHandling == ContinuationContextHandling::ContinueOnThreadPool) + if (callInfo.ContextHandling == ContinuationContextHandling::ContinueOnThreadPool) { continuationFlags |= CORINFO_CONTINUATION_CONTINUE_ON_THREAD_POOL; } @@ -2432,7 +2432,7 @@ SuspensionContextHelper AsyncTransformation::GetSuspensionContextHelper(GenTreeC return SuspensionContextHelper::None; } - if (call->GetAsyncInfo().ContinuationContextHandling == ContinuationContextHandling::ContinueOnCapturedContext) + if (call->GetAsyncInfo().ContextHandling == ContinuationContextHandling::ContinueOnCapturedContext) { return SuspensionContextHelper::WithContinuationContext; } diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp index 5a3c7de6d2960e..1a29b84dc34bbf 100644 --- a/src/coreclr/jit/gentree.cpp +++ b/src/coreclr/jit/gentree.cpp @@ -19958,7 +19958,7 @@ unsigned GenTreeIndir::Size() const return ValueSize().GetExact(); } -ValueSize GenTreeIndir::ValueSize() const +ValueSize GenTreeIndir::GetValueSize() const { assert(isIndir() || OperIsBlk()); return OperIsBlk() ? ::ValueSize(AsBlk()->Size()) : ValueSize::FromJitType(TypeGet()); diff --git a/src/coreclr/jit/gentree.h b/src/coreclr/jit/gentree.h index 9af563110a595f..976d4d02a97468 100644 --- a/src/coreclr/jit/gentree.h +++ b/src/coreclr/jit/gentree.h @@ -4534,7 +4534,7 @@ struct AsyncCallInfo // Behavior where we continue for each call depends on how it was // configured and whether it is a task await or custom await. This field // records that behavior. - ContinuationContextHandling ContinuationContextHandling = ContinuationContextHandling::None; + ContinuationContextHandling ContextHandling = ContinuationContextHandling::None; // Tail awaits do not generate suspension points and the JIT instead // directly returns the callee's continuation to the caller. @@ -8060,7 +8060,7 @@ struct GenTreeIndir : public GenTreeOp ssize_t Offset(); unsigned Size() const; - ValueSize ValueSize() const; + ValueSize GetValueSize() const; GenTreeIndir(genTreeOps oper, var_types type, GenTree* addr, GenTree* data) : GenTreeOp(oper, type, addr, data) diff --git a/src/coreclr/jit/importercalls.cpp b/src/coreclr/jit/importercalls.cpp index 73ae8326e07cde..a2dc06daf660b4 100644 --- a/src/coreclr/jit/importercalls.cpp +++ b/src/coreclr/jit/importercalls.cpp @@ -7073,7 +7073,7 @@ void Compiler::impSetupAsyncCall(GenTreeCall* call, OPCODE opcode, unsigned pref assert(inlCall->IsAsync()); - asyncInfo.ContinuationContextHandling = inlCall->GetAsyncInfo().ContinuationContextHandling; + asyncInfo.ContextHandling = inlCall->GetAsyncInfo().ContextHandling; // Validate that below code won't override the handling assert((prefixFlags & PREFIX_IS_TASK_AWAIT) == 0); m_nextAwaitIsTail = false; @@ -7092,12 +7092,12 @@ void Compiler::impSetupAsyncCall(GenTreeCall* call, OPCODE opcode, unsigned pref if ((prefixFlags & PREFIX_TASK_AWAIT_CONTINUE_ON_CAPTURED_CONTEXT) != 0) { - asyncInfo.ContinuationContextHandling = ContinuationContextHandling::ContinueOnCapturedContext; + asyncInfo.ContextHandling = ContinuationContextHandling::ContinueOnCapturedContext; JITDUMP(" Continuation continues on captured context\n"); } else { - asyncInfo.ContinuationContextHandling = ContinuationContextHandling::ContinueOnThreadPool; + asyncInfo.ContextHandling = ContinuationContextHandling::ContinueOnThreadPool; JITDUMP(" Continuation continues on thread pool\n"); } } @@ -7108,7 +7108,7 @@ void Compiler::impSetupAsyncCall(GenTreeCall* call, OPCODE opcode, unsigned pref if (m_nextAwaitIsTail) { - asyncInfo.ContinuationContextHandling = ContinuationContextHandling::None; + asyncInfo.ContextHandling = ContinuationContextHandling::None; asyncInfo.IsTailAwait = true; m_nextAwaitIsTail = false; } diff --git a/src/coreclr/jit/lclmorph.cpp b/src/coreclr/jit/lclmorph.cpp index 5694f0bfe50e1f..c1ae1c00430ee6 100644 --- a/src/coreclr/jit/lclmorph.cpp +++ b/src/coreclr/jit/lclmorph.cpp @@ -1589,7 +1589,7 @@ class LocalAddressVisitor final : public GenTreeVisitor unsigned offset = val.Offset(); LclVarDsc* varDsc = m_compiler->lvaGetDesc(lclNum); ValueSize lclSize = m_compiler->lvaLclValueSize(lclNum); - ValueSize indirSize = node->AsIndir()->ValueSize(); + ValueSize indirSize = node->AsIndir()->GetValueSize(); if (indirSize.IsNull() || m_compiler->IsWideAccess(lclNum, offset, indirSize)) { @@ -2045,7 +2045,7 @@ class LocalAddressVisitor final : public GenTreeVisitor return false; } - unsigned fieldLclNum = MorphStructFieldAddress(addr, node->ValueSize()); + unsigned fieldLclNum = MorphStructFieldAddress(addr, node->GetValueSize()); if (fieldLclNum == BAD_VAR_NUM) { return false; diff --git a/src/coreclr/jit/morph.cpp b/src/coreclr/jit/morph.cpp index cab5c0609f03d9..40eeb004159f9d 100644 --- a/src/coreclr/jit/morph.cpp +++ b/src/coreclr/jit/morph.cpp @@ -8475,7 +8475,7 @@ GenTree* Compiler::fgMorphFinalizeIndir(GenTreeIndir* indir) { int lclNum = addr->AsLclVarCommon()->GetLclNum(); unsigned offset = addr->AsLclVarCommon()->GetLclOffs(); - ValueSize indirSize = indir->ValueSize(); + ValueSize indirSize = indir->GetValueSize(); if (!IsWideAccess(lclNum, offset, indirSize)) { diff --git a/src/coreclr/jit/valuenum.cpp b/src/coreclr/jit/valuenum.cpp index 78029405054ccf..587ae6158109f1 100644 --- a/src/coreclr/jit/valuenum.cpp +++ b/src/coreclr/jit/valuenum.cpp @@ -6665,7 +6665,7 @@ void Compiler::fgValueNumberArrayElemLoad(GenTree* loadTree, VNFuncApp* addrFunc : ValueSize::FromJitType(elemType); var_types loadType = loadTree->TypeGet(); - ValueSize loadSize = loadTree->AsIndir()->ValueSize(); + ValueSize loadSize = loadTree->AsIndir()->GetValueSize(); ValueNum loadValueVN = vnStore->VNForLoad(VNK_Liberal, wholeElem, elemSize, loadType, offset, loadSize); loadTree->gtVNPair.SetLiberal(loadValueVN); @@ -12608,7 +12608,7 @@ void Compiler::fgValueNumberStore(GenTree* store) GenTreeLclVarCommon* lclVarTree = nullptr; ssize_t offset = 0; - ValueSize storeSize = store->AsIndir()->ValueSize(); + ValueSize storeSize = store->AsIndir()->GetValueSize(); GenTree* baseAddr = nullptr; FieldSeq* fldSeq = nullptr; diff --git a/src/native/libs/System.Native/pal_io.c b/src/native/libs/System.Native/pal_io.c index 7c7ba01153eeab..8bd4b6affea1c1 100644 --- a/src/native/libs/System.Native/pal_io.c +++ b/src/native/libs/System.Native/pal_io.c @@ -1865,8 +1865,8 @@ int32_t SystemNative_ReadThreadInfo(int32_t pid, int32_t tid, ThreadInfo* thread lwpsinfo_t pr; int result = Common_Read(fd, &pr, sizeof(pr)); - close(fd); - if (result < sizeof (pr)) + close(ToFileDescriptor(fd)); + if (result < (int)sizeof(pr)) { errno = EIO; return -1; @@ -1913,8 +1913,8 @@ int32_t SystemNative_ReadProcessInfo(int32_t pid, ProcessInfo* processInfo, uint psinfo_t pr; int result = Common_Read(fd, &pr, sizeof(pr)); - close(fd); - if (result < sizeof (pr)) + close(ToFileDescriptor(fd)); + if (result < (int)sizeof(pr)) { errno = EIO; return -1; diff --git a/src/native/libs/System.Native/pal_process.c b/src/native/libs/System.Native/pal_process.c index 51cc809e1f7d6a..2160b3a31c8d1f 100644 --- a/src/native/libs/System.Native/pal_process.c +++ b/src/native/libs/System.Native/pal_process.c @@ -225,7 +225,7 @@ handler_from_sigaction (struct sigaction *sa) } else { - return sa->sa_handler; + return (VoidIntFn)sa->sa_handler; } } @@ -838,7 +838,10 @@ static int32_t ForkAndExecProcessInternal( struct sigaction sa_default; struct sigaction sa_old; memset(&sa_default, 0, sizeof(sa_default)); // On some architectures, sa_mask is a struct so assigning zero to it doesn't compile + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wstrict-prototypes" sa_default.sa_handler = SIG_DFL; + #pragma clang diagnostic pop for (int sig = 1; sig < NSIG; ++sig) { if (sig == SIGKILL || sig == SIGSTOP) @@ -848,7 +851,12 @@ static int32_t ForkAndExecProcessInternal( if (!sigaction(sig, NULL, &sa_old)) { void (*oldhandler)(int) = handler_from_sigaction (&sa_old); - if (oldhandler != SIG_IGN && oldhandler != SIG_DFL) + bool hasCustomHandler; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wstrict-prototypes" + hasCustomHandler = oldhandler != SIG_IGN && oldhandler != SIG_DFL; +#pragma clang diagnostic pop + if (hasCustomHandler) { // It has a custom handler, put the default handler back. // We check first to preserve flags on default handlers. diff --git a/src/native/libs/System.Native/pal_signal.c b/src/native/libs/System.Native/pal_signal.c index 3e02b2466fc65d..780cb84649c2fd 100644 --- a/src/native/libs/System.Native/pal_signal.c +++ b/src/native/libs/System.Native/pal_signal.c @@ -69,18 +69,28 @@ static bool IsSaSigInfo(struct sigaction* action) static bool IsSigDfl(struct sigaction* action) { assert(action); + bool isDefault; // macOS can return sigaction with SIG_DFL and SA_SIGINFO. // SA_SIGINFO means we should use sa_sigaction, but here we want to check sa_handler. // So we ignore SA_SIGINFO when sa_sigaction and sa_handler are at the same address. - return (&action->sa_handler == (void*)&action->sa_sigaction || !IsSaSigInfo(action)) && - action->sa_handler == SIG_DFL; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wstrict-prototypes" + isDefault = (&action->sa_handler == (void*)&action->sa_sigaction || !IsSaSigInfo(action)) && + action->sa_handler == SIG_DFL; +#pragma clang diagnostic pop + return isDefault; } static bool IsSigIgn(struct sigaction* action) { assert(action); - return (&action->sa_handler == (void*)&action->sa_sigaction || !IsSaSigInfo(action)) && - action->sa_handler == SIG_IGN; + bool isIgnored; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wstrict-prototypes" + isIgnored = (&action->sa_handler == (void*)&action->sa_sigaction || !IsSaSigInfo(action)) && + action->sa_handler == SIG_IGN; +#pragma clang diagnostic pop + return isIgnored; } bool TryConvertSignalCodeToPosixSignal(int signalCode, PosixSignal* posixSignal) @@ -239,7 +249,7 @@ static void SignalHandler(int sig, siginfo_t* siginfo, void* context) else { assert(origHandler->sa_handler); - origHandler->sa_handler(sig); + ((void (*)(int))origHandler->sa_handler)(sig); } } diff --git a/src/native/libs/System.Native/pal_threading.c b/src/native/libs/System.Native/pal_threading.c index 05ddc73ac5c97a..835203a7d7908f 100644 --- a/src/native/libs/System.Native/pal_threading.c +++ b/src/native/libs/System.Native/pal_threading.c @@ -259,13 +259,6 @@ void SystemNative_LowLevelFutex_WakeByAddressSingle(int32_t* address) } #else // defined(TARGET_LINUX) -#ifdef DEBUG -#define DEBUGNOTRETURN __attribute__((noreturn)) -#else -#define DEBUGNOTRETURN -#endif - -DEBUGNOTRETURN void SystemNative_LowLevelFutex_WaitOnAddress(int32_t* address, int32_t comparand) { (void)address; // unused @@ -274,20 +267,16 @@ void SystemNative_LowLevelFutex_WaitOnAddress(int32_t* address, int32_t comparan // trivial implementation of Wait always wakes spuriously. } -DEBUGNOTRETURN int32_t SystemNative_LowLevelFutex_WaitOnAddressTimeout(int32_t* address, int32_t comparand, int32_t timeoutMilliseconds) { (void)address; // unused (void)comparand; // unused (void)timeoutMilliseconds; // unused assert_msg(false, "Futex is not supported on this platform", 0); -#ifndef DEBUG // trivial implementation of Wait always wakes spuriously. return 1; -#endif } -DEBUGNOTRETURN void SystemNative_LowLevelFutex_WakeByAddressSingle(int32_t* address) { (void)address; // unused diff --git a/src/native/libs/System.Native/pal_time.c b/src/native/libs/System.Native/pal_time.c index 1a12d5e4285c42..edb6dccdfc27fb 100644 --- a/src/native/libs/System.Native/pal_time.c +++ b/src/native/libs/System.Native/pal_time.c @@ -32,7 +32,7 @@ int32_t SystemNative_UTimensat(const char* path, TimeSpec* times) updatedTimes[1].tv_sec = (time_t)times[1].tv_sec; updatedTimes[1].tv_nsec = (long)times[1].tv_nsec; - while (CheckInterrupted(result = utimensat(AT_FDCWD, path, updatedTimes, AT_SYMLINK_NOFOLLOW))); + while (CheckInterrupted(result = utimensat((int)AT_FDCWD, path, updatedTimes, AT_SYMLINK_NOFOLLOW))); #else struct timeval updatedTimes[2]; updatedTimes[0].tv_sec = (long)times[0].tv_sec; diff --git a/src/native/libs/System.Native/pal_uid.c b/src/native/libs/System.Native/pal_uid.c index 0f94484cafec4d..8046058688fd37 100644 --- a/src/native/libs/System.Native/pal_uid.c +++ b/src/native/libs/System.Native/pal_uid.c @@ -108,7 +108,7 @@ static pthread_mutex_t s_groupLock = PTHREAD_MUTEX_INITIALIZER; #endif #if !HAVE_GETGROUPLIST -int getgrouplist(const char *uname, gid_t agroup, gid_t *groups, int *groupCount) +static int getgrouplist(const char *uname, gid_t agroup, gid_t *groups, int *groupCount) { int ngroups = 1; int maxgroups = *groupCount; From 72ba2669de7d4478e2d4beefe73bb5bd9eb54b30 Mon Sep 17 00:00:00 2001 From: Adeel Mujahid <3840695+am11@users.noreply.github.com> Date: Fri, 12 Jun 2026 12:56:34 +0000 Subject: [PATCH 2/6] Apply format.patch --- src/coreclr/jit/async.cpp | 4 ++-- src/coreclr/jit/importercalls.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/coreclr/jit/async.cpp b/src/coreclr/jit/async.cpp index d2815a57f0cff4..15c76c07871b33 100644 --- a/src/coreclr/jit/async.cpp +++ b/src/coreclr/jit/async.cpp @@ -1901,8 +1901,8 @@ bool AsyncTransformation::IsReusableSuspension(const AsyncState* state, if (asyncInfoThis.ContextHandling != asyncInfoOther.ContextHandling) { - JITDUMP(" No; disagreement on continuation context handling (%u vs %u)\n", - asyncInfoThis.ContextHandling, asyncInfoOther.ContextHandling); + JITDUMP(" No; disagreement on continuation context handling (%u vs %u)\n", asyncInfoThis.ContextHandling, + asyncInfoOther.ContextHandling); return false; } diff --git a/src/coreclr/jit/importercalls.cpp b/src/coreclr/jit/importercalls.cpp index a2dc06daf660b4..5c349dd94c8833 100644 --- a/src/coreclr/jit/importercalls.cpp +++ b/src/coreclr/jit/importercalls.cpp @@ -7109,8 +7109,8 @@ void Compiler::impSetupAsyncCall(GenTreeCall* call, OPCODE opcode, unsigned pref if (m_nextAwaitIsTail) { asyncInfo.ContextHandling = ContinuationContextHandling::None; - asyncInfo.IsTailAwait = true; - m_nextAwaitIsTail = false; + asyncInfo.IsTailAwait = true; + m_nextAwaitIsTail = false; } call->AsCall()->SetIsAsync(new (this, CMK_Async) AsyncCallInfo(asyncInfo)); From acc3f324ad8289cf57e3f034433002f79a19a3b4 Mon Sep 17 00:00:00 2001 From: Adeel Mujahid <3840695+am11@users.noreply.github.com> Date: Fri, 12 Jun 2026 15:27:36 +0000 Subject: [PATCH 3/6] Address CR feedback --- src/coreclr/jit/async.cpp | 12 ++++++------ src/coreclr/jit/gentree.cpp | 2 +- src/coreclr/jit/gentree.h | 4 ++-- src/coreclr/jit/importercalls.cpp | 12 ++++++------ src/coreclr/jit/lclmorph.cpp | 4 ++-- src/coreclr/jit/morph.cpp | 2 +- src/coreclr/jit/valuenum.cpp | 4 ++-- 7 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/coreclr/jit/async.cpp b/src/coreclr/jit/async.cpp index 15c76c07871b33..df2abfb88f5df7 100644 --- a/src/coreclr/jit/async.cpp +++ b/src/coreclr/jit/async.cpp @@ -1331,7 +1331,7 @@ void AsyncTransformation::BuildContinuation(BasicBlock* block, block->getTryIndex()); } - if (call->GetAsyncInfo().ContextHandling == ContinuationContextHandling::ContinueOnCapturedContext) + if (call->GetAsyncInfo().ContinuationContextHandling == ContinuationContextHandling::ContinueOnCapturedContext) { layoutBuilder->SetNeedsContinuationContext(); JITDUMP(" Continuation continues on captured context; continuation will have context\n"); @@ -1899,10 +1899,10 @@ bool AsyncTransformation::IsReusableSuspension(const AsyncState* state, const AsyncCallInfo& asyncInfoThis = call->GetAsyncInfo(); const AsyncCallInfo& asyncInfoOther = predAsyncCall->AsCall()->GetAsyncInfo(); - if (asyncInfoThis.ContextHandling != asyncInfoOther.ContextHandling) + if (asyncInfoThis.ContinuationContextHandling != asyncInfoOther.ContinuationContextHandling) { - JITDUMP(" No; disagreement on continuation context handling (%u vs %u)\n", asyncInfoThis.ContextHandling, - asyncInfoOther.ContextHandling); + JITDUMP(" No; disagreement on continuation context handling (%u vs %u)\n", + asyncInfoThis.ContinuationContextHandling, asyncInfoOther.ContinuationContextHandling); return false; } @@ -2212,7 +2212,7 @@ void AsyncTransformation::CreateSuspension(BasicBlock* call CORINFO_CONTINUATION_RESULT_INDEX_NUM_BITS); } - if (callInfo.ContextHandling == ContinuationContextHandling::ContinueOnThreadPool) + if (callInfo.ContinuationContextHandling == ContinuationContextHandling::ContinueOnThreadPool) { continuationFlags |= CORINFO_CONTINUATION_CONTINUE_ON_THREAD_POOL; } @@ -2432,7 +2432,7 @@ SuspensionContextHelper AsyncTransformation::GetSuspensionContextHelper(GenTreeC return SuspensionContextHelper::None; } - if (call->GetAsyncInfo().ContextHandling == ContinuationContextHandling::ContinueOnCapturedContext) + if (call->GetAsyncInfo().ContinuationContextHandling == ContinuationContextHandling::ContinueOnCapturedContext) { return SuspensionContextHelper::WithContinuationContext; } diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp index 1a29b84dc34bbf..5a3c7de6d2960e 100644 --- a/src/coreclr/jit/gentree.cpp +++ b/src/coreclr/jit/gentree.cpp @@ -19958,7 +19958,7 @@ unsigned GenTreeIndir::Size() const return ValueSize().GetExact(); } -ValueSize GenTreeIndir::GetValueSize() const +ValueSize GenTreeIndir::ValueSize() const { assert(isIndir() || OperIsBlk()); return OperIsBlk() ? ::ValueSize(AsBlk()->Size()) : ValueSize::FromJitType(TypeGet()); diff --git a/src/coreclr/jit/gentree.h b/src/coreclr/jit/gentree.h index 976d4d02a97468..11347c283f68b6 100644 --- a/src/coreclr/jit/gentree.h +++ b/src/coreclr/jit/gentree.h @@ -4534,7 +4534,7 @@ struct AsyncCallInfo // Behavior where we continue for each call depends on how it was // configured and whether it is a task await or custom await. This field // records that behavior. - ContinuationContextHandling ContextHandling = ContinuationContextHandling::None; + ::ContinuationContextHandling ContinuationContextHandling = ContinuationContextHandling::None; // Tail awaits do not generate suspension points and the JIT instead // directly returns the callee's continuation to the caller. @@ -8060,7 +8060,7 @@ struct GenTreeIndir : public GenTreeOp ssize_t Offset(); unsigned Size() const; - ValueSize GetValueSize() const; + ::ValueSize ValueSize() const; GenTreeIndir(genTreeOps oper, var_types type, GenTree* addr, GenTree* data) : GenTreeOp(oper, type, addr, data) diff --git a/src/coreclr/jit/importercalls.cpp b/src/coreclr/jit/importercalls.cpp index 5c349dd94c8833..73ae8326e07cde 100644 --- a/src/coreclr/jit/importercalls.cpp +++ b/src/coreclr/jit/importercalls.cpp @@ -7073,7 +7073,7 @@ void Compiler::impSetupAsyncCall(GenTreeCall* call, OPCODE opcode, unsigned pref assert(inlCall->IsAsync()); - asyncInfo.ContextHandling = inlCall->GetAsyncInfo().ContextHandling; + asyncInfo.ContinuationContextHandling = inlCall->GetAsyncInfo().ContinuationContextHandling; // Validate that below code won't override the handling assert((prefixFlags & PREFIX_IS_TASK_AWAIT) == 0); m_nextAwaitIsTail = false; @@ -7092,12 +7092,12 @@ void Compiler::impSetupAsyncCall(GenTreeCall* call, OPCODE opcode, unsigned pref if ((prefixFlags & PREFIX_TASK_AWAIT_CONTINUE_ON_CAPTURED_CONTEXT) != 0) { - asyncInfo.ContextHandling = ContinuationContextHandling::ContinueOnCapturedContext; + asyncInfo.ContinuationContextHandling = ContinuationContextHandling::ContinueOnCapturedContext; JITDUMP(" Continuation continues on captured context\n"); } else { - asyncInfo.ContextHandling = ContinuationContextHandling::ContinueOnThreadPool; + asyncInfo.ContinuationContextHandling = ContinuationContextHandling::ContinueOnThreadPool; JITDUMP(" Continuation continues on thread pool\n"); } } @@ -7108,9 +7108,9 @@ void Compiler::impSetupAsyncCall(GenTreeCall* call, OPCODE opcode, unsigned pref if (m_nextAwaitIsTail) { - asyncInfo.ContextHandling = ContinuationContextHandling::None; - asyncInfo.IsTailAwait = true; - m_nextAwaitIsTail = false; + asyncInfo.ContinuationContextHandling = ContinuationContextHandling::None; + asyncInfo.IsTailAwait = true; + m_nextAwaitIsTail = false; } call->AsCall()->SetIsAsync(new (this, CMK_Async) AsyncCallInfo(asyncInfo)); diff --git a/src/coreclr/jit/lclmorph.cpp b/src/coreclr/jit/lclmorph.cpp index c1ae1c00430ee6..5694f0bfe50e1f 100644 --- a/src/coreclr/jit/lclmorph.cpp +++ b/src/coreclr/jit/lclmorph.cpp @@ -1589,7 +1589,7 @@ class LocalAddressVisitor final : public GenTreeVisitor unsigned offset = val.Offset(); LclVarDsc* varDsc = m_compiler->lvaGetDesc(lclNum); ValueSize lclSize = m_compiler->lvaLclValueSize(lclNum); - ValueSize indirSize = node->AsIndir()->GetValueSize(); + ValueSize indirSize = node->AsIndir()->ValueSize(); if (indirSize.IsNull() || m_compiler->IsWideAccess(lclNum, offset, indirSize)) { @@ -2045,7 +2045,7 @@ class LocalAddressVisitor final : public GenTreeVisitor return false; } - unsigned fieldLclNum = MorphStructFieldAddress(addr, node->GetValueSize()); + unsigned fieldLclNum = MorphStructFieldAddress(addr, node->ValueSize()); if (fieldLclNum == BAD_VAR_NUM) { return false; diff --git a/src/coreclr/jit/morph.cpp b/src/coreclr/jit/morph.cpp index 40eeb004159f9d..cab5c0609f03d9 100644 --- a/src/coreclr/jit/morph.cpp +++ b/src/coreclr/jit/morph.cpp @@ -8475,7 +8475,7 @@ GenTree* Compiler::fgMorphFinalizeIndir(GenTreeIndir* indir) { int lclNum = addr->AsLclVarCommon()->GetLclNum(); unsigned offset = addr->AsLclVarCommon()->GetLclOffs(); - ValueSize indirSize = indir->GetValueSize(); + ValueSize indirSize = indir->ValueSize(); if (!IsWideAccess(lclNum, offset, indirSize)) { diff --git a/src/coreclr/jit/valuenum.cpp b/src/coreclr/jit/valuenum.cpp index 587ae6158109f1..78029405054ccf 100644 --- a/src/coreclr/jit/valuenum.cpp +++ b/src/coreclr/jit/valuenum.cpp @@ -6665,7 +6665,7 @@ void Compiler::fgValueNumberArrayElemLoad(GenTree* loadTree, VNFuncApp* addrFunc : ValueSize::FromJitType(elemType); var_types loadType = loadTree->TypeGet(); - ValueSize loadSize = loadTree->AsIndir()->GetValueSize(); + ValueSize loadSize = loadTree->AsIndir()->ValueSize(); ValueNum loadValueVN = vnStore->VNForLoad(VNK_Liberal, wholeElem, elemSize, loadType, offset, loadSize); loadTree->gtVNPair.SetLiberal(loadValueVN); @@ -12608,7 +12608,7 @@ void Compiler::fgValueNumberStore(GenTree* store) GenTreeLclVarCommon* lclVarTree = nullptr; ssize_t offset = 0; - ValueSize storeSize = store->AsIndir()->GetValueSize(); + ValueSize storeSize = store->AsIndir()->ValueSize(); GenTree* baseAddr = nullptr; FieldSeq* fldSeq = nullptr; From cd795486fda7ed0617b349995f80d8175a6ed258 Mon Sep 17 00:00:00 2001 From: Adeel Mujahid <3840695+am11@users.noreply.github.com> Date: Fri, 12 Jun 2026 15:37:20 +0000 Subject: [PATCH 4/6] Apply format patch --- src/coreclr/jit/gentree.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/jit/gentree.h b/src/coreclr/jit/gentree.h index 11347c283f68b6..109e67da1b3347 100644 --- a/src/coreclr/jit/gentree.h +++ b/src/coreclr/jit/gentree.h @@ -8059,7 +8059,7 @@ struct GenTreeIndir : public GenTreeOp unsigned Scale(); ssize_t Offset(); - unsigned Size() const; + unsigned Size() const; ::ValueSize ValueSize() const; GenTreeIndir(genTreeOps oper, var_types type, GenTree* addr, GenTree* data) From e0346a2a4f025244456838745255292d9d3962ef Mon Sep 17 00:00:00 2001 From: Adeel Mujahid <3840695+am11@users.noreply.github.com> Date: Fri, 12 Jun 2026 20:18:54 +0300 Subject: [PATCH 5/6] Fix debug assert annotation --- src/native/libs/System.Native/pal_threading.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/native/libs/System.Native/pal_threading.c b/src/native/libs/System.Native/pal_threading.c index 835203a7d7908f..eb64103d8e4766 100644 --- a/src/native/libs/System.Native/pal_threading.c +++ b/src/native/libs/System.Native/pal_threading.c @@ -259,6 +259,15 @@ void SystemNative_LowLevelFutex_WakeByAddressSingle(int32_t* address) } #else // defined(TARGET_LINUX) +// On illumos/Solaris libc's assert is not annotated noreturn, so marking these stubs noreturn would +// trigger -Winvalid-noreturn there. Only apply the attribute on other platforms. +#if defined(DEBUG) && !defined(TARGET_SUNOS) +#define DEBUGNOTRETURN __attribute__((noreturn)) +#else +#define DEBUGNOTRETURN +#endif + +DEBUGNOTRETURN void SystemNative_LowLevelFutex_WaitOnAddress(int32_t* address, int32_t comparand) { (void)address; // unused @@ -267,16 +276,20 @@ void SystemNative_LowLevelFutex_WaitOnAddress(int32_t* address, int32_t comparan // trivial implementation of Wait always wakes spuriously. } +DEBUGNOTRETURN int32_t SystemNative_LowLevelFutex_WaitOnAddressTimeout(int32_t* address, int32_t comparand, int32_t timeoutMilliseconds) { (void)address; // unused (void)comparand; // unused (void)timeoutMilliseconds; // unused assert_msg(false, "Futex is not supported on this platform", 0); +#if !defined(DEBUG) || defined(TARGET_SUNOS) // trivial implementation of Wait always wakes spuriously. return 1; +#endif } +DEBUGNOTRETURN void SystemNative_LowLevelFutex_WakeByAddressSingle(int32_t* address) { (void)address; // unused @@ -284,6 +297,8 @@ void SystemNative_LowLevelFutex_WakeByAddressSingle(int32_t* address) // trivial implementation of Wake does nothing. } +#undef DEBUGNOTRETURN + #endif // defined(TARGET_LINUX) int32_t SystemNative_CreateThread(uintptr_t stackSize, void *(*startAddress)(void*), void *parameter) From 344c6f796b987988ed74c21967470cc293b901f6 Mon Sep 17 00:00:00 2001 From: Adeel Mujahid <3840695+am11@users.noreply.github.com> Date: Sun, 14 Jun 2026 01:41:23 +0300 Subject: [PATCH 6/6] Disambiguate name to resolve conflict --- src/native/libs/System.Native/pal_uid.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/native/libs/System.Native/pal_uid.c b/src/native/libs/System.Native/pal_uid.c index 8046058688fd37..0ed27af27c537a 100644 --- a/src/native/libs/System.Native/pal_uid.c +++ b/src/native/libs/System.Native/pal_uid.c @@ -108,7 +108,8 @@ static pthread_mutex_t s_groupLock = PTHREAD_MUTEX_INITIALIZER; #endif #if !HAVE_GETGROUPLIST -static int getgrouplist(const char *uname, gid_t agroup, gid_t *groups, int *groupCount) +// Distinct name: avoids -Wmissing-prototypes (illumos) and clashing with grp.h's decl (Emscripten). +static int pal_getgrouplist(const char *uname, gid_t agroup, gid_t *groups, int *groupCount) { int ngroups = 1; int maxgroups = *groupCount; @@ -204,8 +205,10 @@ int32_t SystemNative_GetGroupList(const char* name, uint32_t group, uint32_t* gr #ifdef __APPLE__ // On OSX groups are passed as a signed int. rv = getgrouplist(name, (int)group, (int*)groups, &groupsAvailable); -#else +#elif HAVE_GETGROUPLIST rv = getgrouplist(name, group, groups, &groupsAvailable); +#else + rv = pal_getgrouplist(name, group, groups, &groupsAvailable); #endif #ifdef USE_GROUPLIST_LOCK