Repository navigation
Conversation
MarcZX10
left a comment
There was a problem hiding this comment.
Reviewed exact head fd8ac6f. The descriptor checks match the relinker TLS layout. Allocation aligns the block, copies the initialized template and zeros the remainder, stores one thread pointer per image in a pthread key, and frees each block through the key destructor. The first-access assembly preserves the guest caller-saved GPRs and XMM/YMM state around allocation while returning the thread pointer in RAX; the relinker-generated site restores the saved flags. The author reports the unresolved-symbol failure before the change and successful macOS title execution with #11048. Platform product jobs are skipped by path policy; I could not execute the Apple-specific assembly on this Linux runner.
|
Other open pull requests touch the same code. Merging one will break the other, or both implement the same thing. If this one builds on them, list them in Depends on.
Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.
|
MarcZX10
left a comment
There was a problem hiding this comment.
I rechecked the exact current heads of #11047 (fd8ac6fcb95d0d4838aecb3bafe12d876f0103a2) and #9461 (de5306dd29180871c2010d434fdfcfa71c1f9056). Their implementation changes are independent, but git merge-tree --write-tree reports a content conflict in docs/dev/debt/libkernel.md: #9461 inserts its TSC-frequency entry next to the __tls_get_addr entry that this PR replaces and follows with the new macOS TLS entry. Both entries can be retained, but the current overlap report does not merge automatically.
CONTRIBUTING.md requires the authors to agree which PR goes first when the overlap report identifies shared lines and record the order with Depends on. Please coordinate with #9461’s author and update the checklist/rebase as agreed. This finding concerns the debt-file composition only; I found no same-function implementation in #9461. I’m leaving changes requested until the required ordering is recorded.
|
@milescoviello #9461 and this PR both touch |
FreeBSD code reaches its thread pointer through %fs and macOS cannot set the fs base. The macOS relinker turns each %fs access of a guest image into a stub that reads the thread pointer from a pthread key and calls Aps5GuestTlsAllocate on a thread's first access, registers the TLS descriptor of an image with Aps5GuestTlsRegister, and routes __tls_get_addr to Aps5GuestTlsGetAddr. No library provided them, so a relinked executable could not start. - Aps5GuestTlsRegister validates the descriptor the relinker wrote and creates the key; its destructor frees the block of a thread. - Aps5GuestTlsAllocateThreadPointer allocates the block (the TLS template followed by zeros, then a 0x100-byte thread control block whose first word points at itself, as on FreeBSD) and stores the thread pointer under the key. - Aps5GuestTlsAllocate is the entry the stubs call: rax holds the descriptor and returns the thread pointer, every other register is preserved, the upper halves of the ymm registers only where AVX exists. - Aps5GuestTlsGetAddr returns the block of the thread plus the offset. Co-authored-by: mugurc <mceker@gmail.com>
fd8ac6f to
337a1fc
Compare
|
@milescoviello Thanks. Rebased onto |
|
@imellag thanks. Both entries are there in the rebased debt file. AI-assisted: yes (Claude Code) |
What
This is mugurc's
8b52faaba5from his macOS series (ci/macos-series-2, listed on #1). mugurc is co-author of the commit.main's macOS relinker turns each%fsaccess of a guest image into a stub that callsAps5GuestTlsAllocate_nid_no_patchon a thread's first access, registers each image's TLS descriptor withAps5GuestTlsRegister_nid_no_patch(MacOsImage.cpp), and binds guest modules'__tls_get_addrtoAps5GuestTlsGetAddr_nid_no_patch(MacOsGuestModuleWriter.cpp). No library defines them, so no relinked executable starts on macOS: dyld stops atsymbol not found in flat namespace '_Aps5GuestTlsAllocate_nid_no_patch'.GuestTlsMacOs.cpp(libkernel, whole file under__APPLE__) defines them:Aps5GuestTlsRegisterchecks the descriptor the relinker writes (version 1, layout at offsets 0 to 0x28 asMacOsImage.cppwrites it) and creates the pthread key; the key's destructor frees a thread's block.Aps5GuestTlsAllocateThreadPointerallocates the block: the TLS template, zeros, then a 0x100-byte thread control block whose first word points at itself, as on FreeBSD. It stores the thread pointer under the key.Aps5GuestTlsAllocateis the entry the stubs call:raxholds the descriptor and returns the thread pointer, and every other register is preserved, the upper halves of the ymm registers only where AVX exists.Aps5GuestTlsGetAddrreturns the thread's block plus the offset.The libkernel debt file gets an entry for the macOS TLS design (one block and thread pointer per image, 0 at the stack guard word), and the
__tls_get_addrentry no longer says the macOS resolver is undefined. Linux and Windows build an empty file.Tested
Apple M4 Pro, macOS 27.0.1, Apple clang 21, x86-64 Release under Rosetta 2 (
-DCMAKE_OSX_ARCHITECTURES=x86_64, Ninja,BUILD_TESTING=ON).mainalone doesn't build the libraries on macOS, so the tree ismain61fc572ceewith #10423, the open macOS build PRs (#10366, #10419, #10552, #7631, #7804, #4630, #10540, #10659, #10660, #10669, #10676), #10889, #10898 and the parts of mugurc's series that #7201 also carries. Planet of Lana (PPSA19450) is relinked with that tree's relinker (--macos --to-rosetta).symbol not found in flat namespace '_Aps5GuestTlsAllocate_nid_no_patch'.Linux:
GuestTlsMacOs.cpppassesg++ -std=gnu++20 -fsyntax-onlywith GCC 14 (gcc:14image, x86-64). Not built on Windows; the file is empty there too.check_conventions.py --base upstream/mainpasses.pr_overlap.pyreports #9461, which edits the line next to the__tls_get_addrdebt entry, and #5021 adding a file with the same name; neither touches the same code.#7201 (the whole macOS port) and #5021 (the native ARM64 AOT draft) carry their own versions of these functions. #7201's head (
6687cbac29, 2026-10-16) conflicts withmain, needs a rebase anyway, and is being split into smaller PRs such as #10552 and #10419. #5021 is a draft of more than 43,000 lines that conflicts withmainand says no merge intomainis implied. If either lands first with these functions, this PR is not needed and I will close it.Checklist
main; no other open PR implements the same functions (except Macos port #7201 and feat(aot): consolidate native ARM64 compiler, runtime and consumers #5021, see the end of Tested)NotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file.mdfiles or images added to the repository (attach them to this PR)